log4net使用

2023-11-10

说明:本程序演示如何利用log4net记录程序日志信息。log4net是一个功能著名的开源日志记录组件。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。要想获取最新版本的log4net组件库,可以到官方网站http://logging.apache.org/log4net/下载。现在的最新版本是1.2.10。

下面的例子展示了如何利用log4net记录日志 。

 

 

Log4日志组件的应用确实简单实用,在比较了企业库和Log4的日志功能后,个人觉得Log4的功能更加强大点.补充说明下,我使用的企业库是2.0版本,Log4net是1.2.1版本的.

在Log4net的应用上,已经有人做了说明分析了,在本文中,主要解析下Log4net中的RollingFileAppender的应用.

主要参考了Log4net的帮助文档.在项目中的log4net-1.2.10/doc文件下有.


RollingFileAppender主要是基于FileAppender构建的,很多属性方法都是继承于FileAppender,所以在选项设置上,也有许多是相同的.

下面的例子使日志文件名为log.txt,日志文件名是以文件大小进行变换的,如果旧日志文件大小到100KB时,就会变换文件名为log.txt.1,log.txt.2,log.txt.3...,一直到10为止

  1. <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">  
  2.         <!--日志文件名-->
  3.     <file value="log.txt"/>
  4.     <!--是否在文件中追加-->
  5.     <appendToFile value="true"/>
  6.     <!--按照文件的大小进行变换日志文件-->
  7.     <rollingStyle value="Size"/>
  8.     <!--最大变换数量-->
  9.     <maxSizeRollBackups value="10"/>
  10.     <!--最大文件大小-->
  11.     <maximumFileSize value="100KB"/>
  12.     <!--日志文件名是否为静态-->
  13.     <staticLogFileName value="true"/>
  14.     <layout type="log4net.Layout.PatternLayout">
  15.         <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
  16.     </layout>
  17. </appender>

下面的例子以时间周期变换日志文件名,每分钟都改变日志的文件名,日志文件名为logfileyyyyMMdd-HHmm,这里补充说明下,如果要在这个文件名后面加上.log后缀,必须使用转义字符,比如<datePattern value="yyyyMMdd-HHmm&quot;.log&quot;" />

  1. <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  2.         <!--日志文件名开头-->
  3.     <file value="logfile" />
  4.     <!--是否追加到文件-->
  5.     <appendToFile value="true" />
  6.     <!--变换的形式为日期-->
  7.     <rollingStyle value="Date" />
  8.     <!--日期的格式-->
  9.     <datePattern value="yyyyMMdd-HHmm" />
  10.     <layout type="log4net.Layout.PatternLayout">
  11.         <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  12.     </layout>
  13. </appender>

下面的例子综合使用使用日期和文件大小变换日志文件名。

  1. <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  2.     <!--日志文件名开头-->
  3.     <file value="logfile" />
  4.     <!--是否追加到文件-->
  5.     <appendToFile value="true" />
  6.     <!--混合使用日期和文件大小变换日志文件名-->
  7.     <rollingStyle value="Composite" />
  8.     <!--日期的格式-->
  9.     <datePattern value="yyyyMMdd" />
  10.     <!--最大变换数量-->
  11.     <maxSizeRollBackups value="10" />
  12.     <!--最大文件大小-->
  13.     <maximumFileSize value="1MB" />
  14.     <layout type="log4net.Layout.PatternLayout">
  15.         <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  16.     </layout>
  17. </appender>

下面例子是在每次程序运行的时候,都会备份原先的日志文件,当运行的日志文件大于50G的时候才会变换日志文件名。

  1. <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  2.     <!--日志文件名-->
  3.     <file value="logfile.txt" />
  4.     <!--不追加到原文件-->
  5.     <appendToFile value="false" />
  6.     <!--以日志文件大小变换文件名-->
  7.     <rollingStyle value="Size" />
  8.     <!--最大变换数量,-1为不限制-->
  9.     <maxSizeRollBackups value="-1" />
  10.     <!--最大文件大小-->
  11.     <maximumFileSize value="50GB" />
  12.     <layout type="log4net.Layout.PatternLayout">
  13.         <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  14.     </layout>
  15. </appender>

下面是RollingFileAppender类中的部分Public Instance Properties(公共属性)的说明,没有全部测试,难免谬误,如果你知道,请不要吝啬告写。
CountDirection : 定义当前文件是最小编号的文件还是最大编号的文件。默认为-1,总是以更小的编号。
datePattern : DateFormatter日期格式,string类型。
Encoding : 就是文件的编码,默认为Default,就是程序本身的编码了。
FilterHead : 分割符头部。
ImmediateFlush : 表示是否立即输出到文件,布尔型的。
LockingModel : 文件锁类型,RollingFileAppender本身不是线程安全的,如果在程序中没有进行线程安全的限制,可以在这里进行配置,确保写入时的安全。有两中类型:FileAppender.ExclusiveLockFileAppender.MinimalLock
Name
: 设置本Appander的名称。
SecurityContext : 比较少应用,对日志进行加密只类的,使用SecurityContextProvider转换。(对日志的保密要求比较高的时候应该可以应用上吧,Log4考虑的还挺周全)
Threshold : 设置内容级别的,比如:DEBUG,INFO等等。

 

在Log4net的配置中有两种方法是等价的:
<param name="File" value="log.txt" />
<File value="log.txt" />
个人更倾向后者。在一些数据库上的应用时还有许多Param呢。

 

追加:懒人ABC使用后的一些例子

 

Code
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<configSections>
    
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0"/>
  
</configSections>
  
<log4net>
    
<!--<root>
      
      
<appender-ref ref="LogFileAppender" />
     
    
</root>-->
    
<!--The config of System's default level - FATAL-->
    <appender name="FATAL" type="log4net.Appender.RollingFileAppender">
      
<param name="File" value="Log/gateway_system_fatal_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="100KB"/>
      
<param name="StaticLogFileName" value="false"/>
      
<param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
      
<!--param name="RollingStyle" value="Date"/-->
      
<encoding value="utf-8"/>
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="%d %thread  %p %class %M %L %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="FATAL"/>
        
<param name="LevelMax" value="FATAL"/>
      
</filter>
    
</appender>

    
<!--The config of System's default level - ERROR-->
    <appender name="ERROR" type="log4net.Appender.RollingFileAppender">
      
<param name="File" value="log/gateway_system_error_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="100KB"/>
      
<param name="StaticLogFileName" value="false"/>
      
<param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
      
<!--param name="RollingStyle" value="Date"/-->
      
<encoding value="utf-8"/>
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="%d %thread  %p %class %M %L %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="ERROR"/>
        
<param name="LevelMax" value="ERROR"/>
      
</filter>
    
</appender>

    
<!--The config of System's default level - WARN-->
    <appender name="WARN" type="log4net.Appender.RollingFileAppender">
      
<param name="File" value="log/gateway_system_warn_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="100KB"/>
      
<param name="StaticLogFileName" value="false"/>
      
<param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
      
<!--param name="RollingStyle" value="Date"/-->
      
<encoding value="utf-8"/>
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="%d %thread  %p %class %M %L %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="WARN"/>
        
<param name="LevelMax" value="WARN"/>
      
</filter>
    
</appender>

    
<!--The config of System's default level - INFO-->
    <appender name="INFO" type="log4net.Appender.RollingFileAppender">
      
<param name="File" value="log/gateway_system_info_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="1KB"/>
      
<param name="StaticLogFileName" value="false"/>
      
<param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
      
<!--param name="RollingStyle" value="Date"/-->
      
<encoding value="utf-8"/>
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="%d %thread  %p %class %M %L %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="INFO"/>
        
<param name="LevelMax" value="INFO"/>
      
</filter>
    
</appender>

    
<!--The config of System's default level - DEBUG-->
    <appender name="DEBUG" type="log4net.Appender.RollingFileAppender">
      
<param name="File" value="log/gateway_system_debug_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="100KB"/>
      
<param name="StaticLogFileName" value="false"/>
      
<param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
      
<!--param name="RollingStyle" value="Date"/-->
      
<encoding value="utf-8"/>
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="%d %thread  %p %class %M %L %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="DEBUG"/>
        
<param name="LevelMax" value="DEBUG"/>
      
</filter>
    
</appender>

    
<logger name="logger">
      
<level value="DEBUG" />
      
<appender-ref ref="DEBUG" />
      
<appender-ref ref="INFO" />
      
<appender-ref ref="WARN" />
      
<appender-ref ref="ERROR" />
      
<appender-ref ref="FATAL" />
    
</logger>

  
</log4net>

</configuration>


新的配置

Code
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<configSections>
    
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  
</configSections>
      
     
  
<log4net>
    
<!--The config of System's default level - FATAL-->
    
<appender name="FATAL" type="RealEstate.Common.Log.RealEstateRollingFileAppender">
      
<param name="File" value="Log/fatal_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="10KB"/>
      
<param name="StaticLogFileName" value="false"/>
        
<param name="DatePattern" value="'.'yyyyMMdd'.log'"/>
      
<param name="PrintFlag" value="true" />
      
<encoding value="utf-8"/>
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="[%p][%d{yyyy/MM/dd HH:mm:ss.fff}] [Thread=%thread] %class(%L) %M - %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="FATAL"/>
        
<param name="LevelMax" value="FATAL"/>
      
</filter>
    
</appender>

    
<!--The config of System's default level - ERROR-->
    
<appender name="ERROR" type="RealEstate.Common.Log.RealEstateRollingFileAppender">
      
<param name="File" value="log/error_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="100KB"/>
      
<param name="StaticLogFileName" value="false"/>
        
<param name="DatePattern" value="'.'yyyyMMdd'.log'"/>
      
<param name="PrintFlag" value="true" />
      
<encoding value="utf-8"/>
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="[%p][%d{yyyy/MM/dd HH:mm:ss.fff}] [Thread=%thread] %class(%L) %M - %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="ERROR"/>
        
<param name="LevelMax" value="ERROR"/>
      
</filter>
    
</appender>

    
<!--The config of System's default level - WARN-->
    
<appender name="WARN" type="RealEstate.Common.Log.RealEstateRollingFileAppender">
      
<param name="File" value="log/warn_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="10KB"/>
      
<param name="StaticLogFileName" value="false"/>
        
<param name="DatePattern" value="'.'yyyyMMdd'.log'"/>
      
<param name="PrintFlag" value="true" />
      
<encoding value="utf-8"/>
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="[%p][%d{yyyy/MM/dd HH:mm:ss.fff}] [Thread=%thread] %class(%L) %M - %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="WARN"/>
        
<param name="LevelMax" value="WARN"/>
      
</filter>
    
</appender>

    
<!--The config of System's default level - INFO-->
    
<appender name="INFO" type="RealEstate.Common.Log.RealEstateRollingFileAppender">
      
<param name="File" value="log/info_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="10KB"/>
      
<param name="StaticLogFileName" value="false"/>
        
<param name="DatePattern" value="'.'yyyyMMdd'.log'"/>
      
<param name="PrintFlag" value="true" />
      
<encoding value="utf-8"/>
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="[%p][%d{yyyy/MM/dd HH:mm:ss.fff}] [Thread=%thread] %class(%L) %M - %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="INFO"/>
        
<param name="LevelMax" value="INFO"/>
      
</filter>
    
</appender>

    
<!--The config of System's default level - DEBUG-->
    
<appender name="DEBUG" type="RealEstate.Common.Log.RealEstateRollingFileAppender">
      
<param name="File" value="log/debug_"/>
      
<param name="AppendToFile" value="true"/>
      
<param name="RollingStyle" value="Composite" />
      
<param name="MaxSizeRollBackups" value="100"/>
      
<param name="MaximumFileSize" value="10KB"/>
      
<param name="StaticLogFileName" value="false"/>
      
<param name="DatePattern" value="'.'yyyyMMdd'.log'"/>
      
<param name="PrintFlag" value="false" />
      
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="[%p][%d{yyyy/MM/dd HH:mm:ss.fff}] [Thread=%thread] %class(%L) %M - %m%n"/>
      
</layout>
      
<filter type="log4net.Filter.LevelRangeFilter">
        
<param name="LevelMin" value="DEBUG"/>
        
<param name="LevelMax" value="DEBUG"/>
      
</filter>
    
</appender>

    
<!--The basic config-->
    
<root>
    
<!--The whole switch.(Whose the level is greater than or equals to this will be display)-->

      
<level value="INFO" />
      
<!--appender-ref ref="DEBUG" /-->
      
<appender-ref ref="INFO" />
      
<appender-ref ref="WARN" />
      
<appender-ref ref="ERROR" />
      
<!--appender-ref ref="FATAL" /-->
    
</root>

  
</log4net>

</configuration>
Code
//******************************************************************************
// @file              RealEstateRollingFileAppender.cs
// @namespace         RealEstate.Common.Log
// @brief             RealEstateのFileAppender
// @version           1.0
// @date              2009/03/12
// @author   Design : XXX/2009/03/12
// @author   Code   : XXX/2009/03/12
// @author   Modify : XXX/2009/03/12
// @note     Module : Common
//******************************************************************************

using System;
using System.Collections.Generic;
using System.Text;
using log4net.Appender;
using log4net.Core;

namespace RealEstate.Common.Log
{
    
/// <summary>
    
/// ログファイルクラス
    
/// </summary>
    public class RealEstateRollingFileAppender : RollingFileAppender
    {
        
/// <summary>
        
/// ログが出力するかどうかのフラグ
        
/// </summary>
        private bool printFlag = true;

        
/// <summary>
        
/// ログが出力するかどうかのフラグを取得、設定
        
/// </summary>
        public bool PrintFlag
        {
            
get { return printFlag; }
            
set { printFlag = value; }
        }

        
/// <summary>
        
/// ログを出力する
        
/// </summary>
        
/// <param name="loggingEvent">ログ情報</param>
        override protected void Append(LoggingEvent loggingEvent)
        {
            
// ログが出力の場合
            if (printFlag)
            {
                
// ログレベルによって、ログを出力する
                string loggerName = loggingEvent.Level.Name;
                
string name = base.Name;
                
if (loggerName == name)
                {
                    
base.Append(loggingEvent);
                }
            }
        }
    }
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhoufoxcn/archive/2008/03/26/2220533.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

log4net使用 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在 Kotlin 中验证输入字符串是否为有效日期?

    So my Kotlin应用程序正在接受一个输入字符串 该字符串应该是某种格式的日期 fun haveFun dateStr String var formatter DateTimeFormatter ofPattern dd MMM y
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 手机连云服务器传文件,手机云服务器传输文件

    手机云服务器传输文件 内容精选 换一换 本节操作介绍本地Linux操作系统主机通过SCP向Linux云服务器传输文件的操作步骤 登录管理控制台 在ECS列表页面记录待上传文件的云服务器的弹性公网IP 上传文件在本地Linux操作系统主机上执
  • java操作es集群模糊查询等

    首先引入依赖
  • Groovy简介和一点资源

    Groovy简介 简单地说 Groovy是一门基于JVM的动态语言 我们可以把它当成JVM上的Python语言来使用 而且Groovy的有些语法都和Python Ruby等脚本语言很相似 Groovy最后也会被编译为Java字节码 在JVM
  • 【java】之3种方式实现Object和Map之间的转换

    转载 java 之3种方式实现Object和Map之间的转换 古越剑箫 博客园
  • 我的postfix+postfixadmin邮件服务器架设过程

    Step1 安装apache mysql php 配置dns 如果mysql为自定义安装 请做以下操作 PATH PATH usr local mysql bin export PATH echo usr local mysql lib m
  • HTML5新控件 - url类型输入框(网址)

    如果需要一个用来填写url地址的输入框 可以使用url类型 这样浏览器可以帮我们验证格式是否正确 而不需要自己写验证规则 网址验证规则 首先要有一个URL前缀 http ftp 等 后面可以是空格和大多数特殊字符 冒号除外
  • Theano学习系列(3):符号变量的方法之creat new tensor

    Theano学习系列 3 符号变量的方法之Creat New Tensor 和前两节一样 本节重点讲述tensor方法中的creat new tensor这些知识 这一节共有11个函数需要我们去学习掌握 由于有的函数区别很小 这里只介绍一部
  • AD 画PCB布线时,走线网线高亮,其它不走线网络变黑的设置方法

    正常布线时显示效果 布线时所有PCB显示都正常 设置不走线网格变黑的方法 2 1 T P调出配置项 tools Preferences PCB Editor Display中Highlighting Options 然后勾选apply ma
  • 通过Pyecharts和Matplotlib对数据中的性别信息进行可视化

    前言 在进行描述性数据分析时会遇到需要进行分类统计的数据 例如性别 所在地区等等 本篇文章用数据中的性别信息为例并通过Pyecharts和Matplotlib对其进行可视化 1 导入数据 import pandas as pd import
  • 熵、联合熵、条件熵

    1 单变量的熵 离散型随机变量的熵 熵是一个随机变量不确定性的度量 一个随机变量的熵越大 意味着不确定性越大 换言之 该随机变量包含的信息量越大 必然事件是确定无疑的 并不含有不确定性 所以必然事件的熵应该是0 也就是说 必然事件不含有信息
  • MIPI(D-PHY)协议简介&测量方法&测试项简介

    作者 AirCity 2020 2 20 Aircity007 sina com 本文所有权归作者Aircity所有 1 MIPI Alliance 说起MIPI 就得说下这个MIPI Alliance 这个联盟聚集了很多知名IC大厂 手机
  • Kubernetes[k8s] 最新版1.27.3安装教程,使用containerd模式

    背景 公司使用的是交老的k8s版本 1 16 由于老版本的K8s对于现在很多新特性不支持 所以需要升级到新版本 目前2023年7月11日最新版本的k8s是v1 27 3 通过参考官方文档进行k8s部署工作 其中涉及到操作系统配置 防火墙配置
  • ES6 中的let、const与var的区别

    首先需要明确的是let const var都是用来定义变量的 在ES6之前 我们一般都用var来定义变量 例如 function test var i 1 console log i console log j var j 2 test c
  • xgboost的优势是什么,为什么能在人工智能竞赛中取得好成绩

    XGBoost eXtreme Gradient Boosting 是一种高效的集成学习算法 它是在基于决策树的梯度提升算法的基础上进行改进 它的优势在于 高效 XGBoost使用了并行化处理 能够快速训练大规模的数据集 稳定 XGBoos
  • vscode 无法连接远程服务器 .vscode-server Permission denied

    错误log 用 VScode直接连接服务器 遇到这个问题 我的终端ssh是可以直接登上服务器的 VScode不行 18 41 45 067 Server installation process already in progress wa
  • Python操作mongodb数据库详解

    数据库的分类 数据库可以简单的分为 MySQL 和 NOSQL 两类 这里的 NOSQL 不是 NO SQL 的意思 他的意思是 Not Only MySQL MySQL与NoSQL之间的区别 1 MySQL是一个基于表格设计的关系数据库
  • 线性代数学习笔记——第七十一讲——正交矩阵

    1 正交矩阵引例 2 正交矩阵的定义 3 正交矩阵的充要条件是其行 列 向量组都是规范正交向量组 4 正交矩阵判定示例 5 正交矩阵的应用示例1 6 正交矩阵的应用示例2
  • 【MacOS】SSH 设置别名+免密登录

    设置别名 首先 进入ssh的config文件 vim ssh config 按I写入 Host my name User zmq HostName 1xx xx xx xxx Port 22 输入 x保存退出 设置别名成功 可以直接 ssh
  • 朴素贝叶斯算法_朴素贝叶斯算法介绍(补充)

    朴素贝叶斯是基于贝叶斯决策理论和特征属性独立假设的生成方法 朴素贝叶斯中的朴素是指特征条件独立假设 贝叶斯定理是用来描述两个条件概率之间的关系 上一篇有做一些介绍 朴素贝叶斯算法介绍 这次做一些补充 1 贝叶斯原理 先验概率 通过经验来判断
  • log4net使用

    说明 本程序演示如何利用log4net记录程序日志信息 log4net是一个功能著名的开源日志记录组件 利用log4net可以方便地将日志信息记录到文件 控制台 Windows事件日志和数据库 包括MS SQL Server Access