在日常的开发中我们经常会用到日志,最近开发的时候老是听到别的其他开发人员让测试把日志级别从debug降到info或者等等之类的,所以就比较好奇日志级别到底有哪几种以及各种日志级别到底是怎么发挥作用的呢?于是看了下公司的源码,发现我们的log类是继承自log4net的,所以简单学习下该类。
日志级别
在log4Net中有7种日志级别,其中常用的有5种: DEBUG,INFO,WARN,ERROR,FATAL。级别从低到高,依照等级次序决定是否写入。
日志级别 | 备注 |
ALL Level | ALL Level是最低等级的,用于打开所有日志记录。 |
DEBUG Level | DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。 |
INFO level | INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。 |
WARN level | WARN level表明会出现潜在错误的情形。 记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。 |
ERROR level | ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。 |
FATAL level | FATAL level指出每个严重的错误事件将会导致应用程序的退出,记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。 |
OFF Level | OFF Level是最高等级的,用于关闭所有日志记录。 |
高于等级设定值方法都能写入日志, Off所有的写入方法都不写到日志里,ALL则相反。例如当我们设成Info时,logger.Debug就会被忽略而不写入文件,但是FATAL,ERROR,WARN,INFO会被写入,因为他们等级高于INFO。在生产环境,建议把debug的日志级别重新调为warn或者更高,避免产生大量日志。
日志配置
日志级别了解后需要在系统内加一个日志的配置文件:Log4Net.config。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections> <log4net debug="true"> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--file可以指定具体的路径 eg : d:\\test.log。不指定的话log被生成在项目的bin/Debug 或者 bin/Release目录下 (web的项目 默认生成在根目录下)--> <file value="applicationLog.log" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /><!--备份log文件的个数最多10个--> <!--每个log文件最大是2M,如果超过2M将重新创建一个新的log文件,并将原来的log文件备份。--> <maximumFileSize value="2MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <!--指定log的格式--> <conversionPattern value="[%date] %thread -- %-5level -- %logger [%M] -- %message%newline" /> </layout> </appender> <root> <level value="DEBUG" /><!--指定将此级别及以上的log打印到log文件中--> <appender-ref ref="RollingLogFileAppender" /> </root> </log4net> </configuration>
整个步骤其实就是先引入log4net的dll,然后引入到自己的项目中来,然后添加配置到 assemblyinfo.cs文件:
[assembly: log4net.Config.XmlConfigurator(ConfigFile="Log4Net.config", Watch=true)]
log4net源码
部分log4net的源码,不仅仅包括各种异常的定义,也包含一些异常打点的标准格式方法。
// Decompiled with JetBrains decompiler // Type: log4net.ILog // Assembly: log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905 // MVID: 4BFEBC64-FD47-43B4-B376-302A10C947E5 // Assembly location: D:\MultiTenant项目\packages\log4net.1.2.10.1\lib\net11\log4net.dll using log4net.Core; using System; namespace log4net { public interface ILog : ILoggerWrapper { void Debug(object message); void Debug(object message, Exception exception); void DebugFormat(string format, params object[] args); void DebugFormat(IFormatProvider provider, string format, params object[] args); void Info(object message); void Info(object message, Exception exception); void InfoFormat(string format, params object[] args); void InfoFormat(IFormatProvider provider, string format, params object[] args); void Warn(object message); void Warn(object message, Exception exception); void WarnFormat(string format, params object[] args); void WarnFormat(IFormatProvider provider, string format, params object[] args); void Error(object message); void Error(object message, Exception exception); void ErrorFormat(string format, params object[] args); void ErrorFormat(IFormatProvider provider, string format, params object[] args); void Fatal(object message); void Fatal(object message, Exception exception); void FatalFormat(string format, params object[] args); void FatalFormat(IFormatProvider provider, string format, params object[] args); bool IsDebugEnabled { get; } bool IsInfoEnabled { get; } bool IsWarnEnabled { get; } bool IsErrorEnabled { get; } bool IsFatalEnabled { get; } } }
最后总结下关于日志的一些收获:
总而言之,常用的日志级别其实就四种:DEBUG,INFO,WARN,ERROR。然后我们大多数情况下只关心ERROR就可以,如果有时候通过ERROR定位不出问题,name通过修改配置文件将打印的日志级别降低为WARN(可以看WARN,ERROR)或者INFO(可以看INFO,WARN,ERROR)甚至DEBUG(可以看DEBUG,INFO,WARN,ERROR)来获取更多的信息,所以我常听到的开发让测试同学修改日志级别就明白了,调的越低能看到更多的辅助查问题的信息然后来查问题。