Log4Net⽇志记录简单使⽤讲解
⼀. Log4Net 简介
Log4net 是 Apache 下⼀个开放源码的项⽬,我们可以控制⽇志信息的输出⽬的地(数据库、控制台、⽂本⽂档、⽂件)。Log4net中定义了多种⽇志信息输出模式。
在做项⽬的时候令我最头疼的是在程序发布到正式环境之后出现了问题,我们不能调试⽽且问题很难重新,于是我们需要⼤量的⽇志数据来精确的跟踪程序的运⾏状况。ction是什么意思
Log4net就可以帮我来解决这⼀个难题,对于⽇志的输出我们不需要⼈为的去⼲涉,它可以根据需要将⽇志输出到控制台,⽂本⽂
件,windows ⽇志事件查看器中,包括数据库,邮件等等位置,以便我们快速跟踪程序bug。
⼆. Log4Net 简单使⽤
使⽤Log4net必须引⼊log4net.dll ⽂件,因为log4net 是开源的,所以可以直接将源码添加到⼯程项⽬中去。然后⽣成新的dll⽂件。
1.⾸先引⽤Log4Net.dll
2.如果是在Web程序中,我们可以将这句话添加到 Global.asax ⽂件的Application_Start(object nder, EventArgs e) ⽅法中,在程序启动的时候就初始化配置信息:
log4net.Config.XmlConfigurator.Configure(); --这句话相当于初始化注册Log4net ,
注:如果不是Web程序则每次调⽤时候写这句话。
3.配置fig
下⾯使⽤配置⼀个最简单的⽂件输出和控制台输出。
Log4Net 的配置⽂件,此段内容添加到fig 或者 fig ⽂件中:
<configSections>
<ction name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="D:\a.log"></file>
<appendToFile value="true"></appendToFile>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%d]:%n%m%n"></conversionPattern>
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%d]:%n%m%n"></conversionPattern>
</layout>
</appender>
<root>
<level value="INFO"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</root>
<logger name="MyLogger">
<level value="ERROR"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
</ log4net>
控制台程序测试例⼦:
ILog log = LogManager.GetLogger("MyLogger");
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
Program program = new Program();
program.log.Info(">>>>>>>>>>>>>>");
program.log.Info(">>>>>>>>>>>>>>1");
program.log.Info(">>>>>>>>>>>>>>2");
}
注:上述例⼦是不会输出任何⽇志信息的,因为配置级别的限制。下⾯我们来看下⽇志的结构
三. Log4Net 结构
Log4net 主要分为5个核⼼组件: Logger, Appender, Filter, Layout, Object Render。
Logger:
主要⽤于记录⽇志的分类和控制⽇志的级别。它可以以多种格式输出⽇志信息,同时它也可以控制⽇志的输出级别。上⾯的简单例⼦我们看似做了⽇志输出,但是没有输出任何⽇志结果,因为我们在⽇志级别上做了限制。
Appender:
这⾥我们简单称之为“附着器”。意思就是说⽇志的输出必须依赖于它,更确切的说以⽂本形式输出,还是控制台格式输出都必须要依靠它来控制。Log4net定义了多种附着器:
(1) AdoNetAppender 将⽇志记录到数据库中。可以采⽤SQL和存储过程两种⽅式。
(2) AnsiColorTerminalAppender 在ANSI 窗⼝终端写下⾼亮度的⽇志事件。
(3) AspNetTraceAppender 能⽤asp中Trace的⽅式查看记录的⽇志。
(4) BufferingForwardingAppender 在输出到⼦Appenders之前先缓存⽇志事件。
(5) ConsoleAppender 将⽇志输出到控制台。
(6) EventLogAppender 将⽇志写到Windows Event Log。
(7) FileAppender 将⽇志写到⽂件中。
(8) MemoryAppender 将⽇志存到内存缓冲区。
(9) NetSendAppender 将⽇志输出到Windows Mesnger rvice,这些⽇志信息将在⽤户终端的对话框中显⽰。
(10) RemoteSyslogAppender 通过UDP⽹络协议将⽇志写到Remote syslog rvice。
(11) RemotingAppender 通过 Remoting将⽇志写到远程接收端。
(12) RollingFileAppender 将⽇志以回滚⽂件的形式写到⽂件中。
(13) SmtpAppender 将⽇志写到邮件中。
(14) TraceAppender 将⽇志写到 trace 系统。
(15) UdpAppender 将⽇志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式⼴播。
Filter:
Appender 是将⽇志以缺省值的⽅式输出,意思就是按照默认值的⽅式输出。⽽Filter 意思就是过滤器,使⽤Filter 可以将⽇志以不同格式来输出。
Layout:
这个⽤于控制⽇志输出显⽰格式。
Object Render:
⽤于按照⽤户⾃定义标准来输出⽇志。
Log4net 结构图(从其他地⽅截图过来)
Log4net 的⽇志对象管理器LogManager:LogManager是⽤于来管理所有的Logger对象的,GetLogger() 可以⽤来查找已经存在的Logger 对象,如果对象不存在它会⾃动创建⼀个Logger对象,并且管理它。
四. Log4Net ⽇志级别
Log4net 分为如下⼏个级别:
FATAL 毁灭级别
ERROR 错误级别
WARN 警告级别
INFO 消息级别
melody是什么意思 DEBUG 调试级别
这⼏种⽇志级别⾼低:FATAL> ERROR> WARN > INFO > DEBUG。
只有⽇志输出级别⼤于或等于配置的级别才能输出⽇志信息。
⽐如我的⽇志配置级别为INFO,那么只有log.Info(), log.Warn(), log.Error(), log.Fatal()才能输出⽇志信息,Debug⽅式就不能输出。 Log4net中还有两种特殊的配置级别: ALL - 允许所有的⽇志级别输出,OFF - 拒绝所有的⽇志级别输出。
五. Log4Net 配置说明
<configSections>
小学古诗三百首
<ction name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
btk</configSections>
<log4net>
<!--记录⽇志到数据库-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=GAS-HECHEN;initial catalog=dsc141051_db;integrated curity=fal;persist curity
info=True;Ur ID=sa;Password=000000" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread,
@log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
进度英语
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
太原翻译公司
gmb
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>负责人 翻译
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!--输⼊⽇志到控制台-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"></conversionPattern>
</layout>
</appender>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<param name="file" value="D:\a.log"></param>
人教版小学英语教案<param name="appendToFile" value="true"></param>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"></conversionPattern>
</layout>
chinajoy是什么
</appender>
<root>
<level value="INFO"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</root>
<logger name="MyLogger">
<level value="INFO"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
</log4net>
这个配置⽂件定义了三种不同的Appender,分别是ADO 记录到数据,ConsoleAppender 从控制台输出, FileAppender ⽇志信息⽂件输出。
然⽽Log4Net 的配置附着器远不⽌这些,这⾥上传⼀个⽐较全的附着器配置⽂件供⼤家参考。
根据上⾯的⽇志配置⽂件仍然使⽤如下代码测试:
这⾥需要注意,log4net.Config.XmlConfigurator.Configure(); 这个相当于初始化Log4net, 如果是在Web程序中,我们可以将这句话添加到 Global.asax ⽂件的Application_Start(object nder, EventArgs e) ⽅法中,在程序启动的时候就初始化配置信息。
上⾯的程序运⾏结果图,控制台输出结果为:
信息记录到指定的磁盘⽂件中,记录的结果如下图:
这⾥说明两个配置:
这⾥的 root 和 logger 配置节点,root 就相当于默认的⽇志对象配置,⽽logger是指定特定的⽇志配置。他们可以共存。
对于这两个节点下⾯都有 level 和 appender-ref 节点,分别⽤于指定⽇志的输出级别和引⽤哪些附着器。每个⽇志对象都可以使⽤多个appender,这⾥的配置同时使⽤⽂件输出和控制台输出。得到的结果就是上⾯两个结果图。
下⾯的logger对象添加了AdoNetAppender附着器,当使⽤MyLogger⽇志对象的时候就会使⽤这三种不同的⽅式记录⽇志。
上⾯的程序声明了两个⽇志对象 log 和 log1,log 是在初始化的时候存在的,它得到的是<logger name="MyLogger"> 这个⽇志对象,⽽log1 是 LogManager 中不存在的⽇志对象,这⾥它会重新创建⼀个并且由LogManager 管理,后⾯再次使⽤则使⽤这个已经存在的对象。这⾥两个⽇志对象同时使⽤结果如下:
现在我修改配置⽂件的⽇志⽂件输出级别:
<logger name="MyLogger">
<level value="WARN"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
<appender-ref ref="AdoNetAppender"></appender-ref>
</ logger>
运⾏得到的结果如图:
显然MyLogger对象⽇志没有输出⽇志信息。
六. Log4Net 参数说明
上⾯我们看到的配置⽂件中有类似 %m %n 等这样的符号,这些符号都是有特殊意义的。
%m[%message] : 输出的⽇志消息
%n : 换⾏
%d[%datetime] : 输出当前语句运⾏的时刻
%r : 输出程序从运⾏到执⾏到当前语句时消耗的毫秒数
%d :当前语句所在的线程ID
%p : ⽇志的当前优先级别
%c :当前⽇志对象的名称
%L : 输出语句所在的⾏号
%F :输出语句所在的⽂件名
%-数字:表⽰该项的最⼩长度,如果不够,则⽤空格填充