首先感慨下,如今的程序员作的工做由于高级语言的生产力,系统框架模式的成熟,开源大牛的贡献,已经成愈来愈偏向 “面向配置编程”了......html
详细使用指南见文章:http://blog.csdn.net/zhoufoxcn/article/details/2220533程序员
1.Log4net的结构编程
1.1 Loggerapp
Logger是应用程序须要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先通过Layout的格式化处理后才会输出。Log4net框架定义了一个ILog接口,全部的logger类都必须实现这个接口。若是你想实现一个自定义的logger,你必须首先实现这个接口,ILog定义以下:框架
public interface ILog { void Debug(object message); void Info(object message); void Warn(object message); void Error(object message); void Fatal(object message); //以上的每个方法都有一个重载的方法,用来支持异常处理。 //每个重载方法都以下所示,有一个异常类型的附加参数。 void Debug(object message, Exception ex); // ... //Boolean 属性用来检查Logger的日志级别 //(咱们立刻会在后面看到日志级别) bool isDebugEnabled; bool isInfoEnabled; //… 其余方法对应的Boolean属性 }
Log4net框架定义了一个叫作LogManager的类,用来管理全部的logger对象。它有一个GetLogger()静态方法,用咱们提供的名字参数来检索已经存在的Logger对象。若是框架里不存在该Logger对象,它也会为咱们建立一个Logger对象。代码以下所示:less
log4net.ILog log = log4net.LogManager.GetLogger("logger-name");
一般来讲,咱们会以类(class)的类型(type)为参数来调用GetLogger(),以便跟踪咱们正在进行日志记录的类。传递的类(class)的类型(type)能够用typeof(Classname)方法来得到,或者能够用以下的反射方法来得到:flex
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
1.2 Repositoryspa
Repository主要用于负责日志对象组织结构的维护。在log4net的之前版本中,框架仅支持分等级的组织结构(hierarchical organization)。这种等级结构本质上是库的一个实现,而且定义在log4net.Repository.Hierarchy 名字空间中。要实现一个Repository,须要实现log4net.Repository.ILoggerRepository 接口。可是一般并非直接实现该接口,而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库 (hierarchical repository )则由log4net.Repository.Hierarchy.Hierarchy类实现。.net
若是你是个log4net框架的使用者,而非扩展者,那么你几乎不会在你的代码里用到Repository的类。相反的,你须要用到LogManager类来自动管理库和日志对象。线程
1.3 Appender
一个好的日志框架应该可以产生多目的地的输出。好比说输出到控制台或保存到一个日志文件。log4net 可以很好的知足这些要求。它使用一个叫作Appender的组件来定义输出介质。正如名字所示,这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你能够把多个Appender组件附加到一个日志对象上。 Log4net框架提供了几个Appender组件。关于log4net提供的Appender组件的完整列表能够在log4net框架的帮助手册中找到。有了这些现成的Appender组件,通常来讲你没有必要再本身编写了。可是若是你愿意,能够从log4net.Appender.AppenderSkeleton类继承。
1.4 Appender Filters
一个Appender 对象缺省地将全部的日志事件传递到输出流。Appender的过滤器(Appender Filters) 能够按照不一样的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预约义的过滤器。使用这些过滤器,你能够按照日志级别范围过滤日志事件,或者按照某个特殊的字符串进行过滤。你能够在API的帮助文件中发现更多关于过滤器的信息。
1.5 Layout
一个Appender 对象缺省地将全部的日志事件传递到输出流。Appender的过滤器(Appender Filters) 能够按照不一样的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预约义的过滤器。使用这些过滤器,你能够按照日志级别范围过滤日志事件,或者按照某个特殊的字符串进行过滤。你能够在API的帮助文件中发现更多关于过滤器的信息。
2.使用配置文件
log4net框架会在相对于AppDomain.CurrentDomain.BaseDirectory 属性定义的目录路径下查找配置文件。框架在配置文件里要查找的惟一标识是<log4net>标签。一个完整的配置文件的例子以下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler"></section> </configSections> <log4net> <appender name="errorAppender" type="log4net.Appender.RollingFileAppender"> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="ERROR" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> <File value="Logs\err.log" /> <PreserveLogFileNameExtension value="true" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <appender name="infoAppender" type="log4net.Appender.RollingFileAppender"> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="INFO" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> <File value="Logs\info.log" /> <PreserveLogFileNameExtension value="true" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <appender name="debugAppender" type="log4net.Appender.RollingFileAppender"> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="DEBUG" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> <File value="Logs\debug.log" /> <PreserveLogFileNameExtension value="true" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <appender name="perfAppender" type="log4net.Appender.RollingFileAppender"> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="INFO" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> <File value="Logs\perf.log" /> <PreserveLogFileNameExtension value="true" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %logger - %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="errorAppender" /> <appender-ref ref="infoAppender" /> <appender-ref ref="debugAppender" /> </root> <logger name="Performance" additivity="false"> <level value="ALL" /> <appender-ref ref="perfAppender" /> </logger> </log4net> </configuration>
配置解析:
Appenders
<appender>标签的基本形式如上面所示。它定义了appender的名字和类型。 另外比较重要的是<appender>标签内部的其余标签。
The following appender type are defined in the log4net package:
Type | Description |
---|---|
log4net.Appender.AdoNetAppender | Writes logging events to a database using either prepared statements or stored procedures. |
log4net.Appender.AnsiColorTerminalAppender | Writes color highlighted logging events to a an ANSI terminal window. |
log4net.Appender.AspNetTraceAppender | Writes logging events to the ASP trace context. These can then be rendered at the end of the ASP page or on the ASP trace page. |
log4net.Appender.BufferingForwardingAppender | Buffers logging events before forwarding them to child appenders. |
log4net.Appender.ColoredConsoleAppender | Writes logging events to the application's Console. The events may go to either the standard our stream or the standard error stream. The events may have configurable text and background colors defined for each level. |
log4net.Appender.ConsoleAppender | Writes logging events to the application's Console. The events may go to either the standard our stream or the standard error stream. |
log4net.Appender.DebugAppender | Writes logging events to the .NET system. |
log4net.Appender.EventLogAppender | Writes logging events to the Windows Event Log. |
log4net.Appender.FileAppender | Writes logging events to a file in the file system. |
log4net.Appender.ForwardingAppender | Forwards logging events to child appenders. |
log4net.Appender.LocalSyslogAppender | Writes logging events to the local syslog service (UNIX only). |
log4net.Appender.MemoryAppender | Stores logging events in an in memory buffer. |
log4net.Appender.NetSendAppender | Writes logging events to the Windows Messenger service. These messages are displayed in a dialog on a users terminal. |
log4net.Appender.OutputDebugStringAppender | Writes logging events to the debugger. If the application has no debugger, the system debugger displays the string. If the application has no debugger and the system debugger is not active, the message is ignored. |
log4net.Appender.RemoteSyslogAppender | Writes logging events to a remote syslog service using UDP networking. |
log4net.Appender.RemotingAppender | Writes logging events to a remoting sink using .NET remoting. |
log4net.Appender.RollingFileAppender | Writes logging events to a file in the file system. The RollingFileAppender can be configured to log to multiple files based upon date or file size constraints. |
log4net.Appender.SmtpAppender | Sends logging events to an email address. |
log4net.Appender.SmtpPickupDirAppender | Writes SMTP messages as files into a pickup directory. These files can then be read and sent by an SMTP agent such as the IIS SMTP agent. |
log4net.Appender.TelnetAppender | Clients connect via Telnet to receive logging events. |
log4net.Appender.TraceAppender | Writes logging events to the .NET trace system. |
log4net.Appender.UdpAppender | Sends logging events as connectionless UDP datagrams to a remote host or a multicast group using a UdpClient. |
有关每种appender的具体配置的例子,能够在log4net\doc\manual\example-config-appender.html中获得。
Appender元素里的<filter>标签
The following filter type are defined in the log4net package:
Type | Description |
---|---|
log4net.Filter.DenyAllFilter | Drops all logging events. |
log4net.Filter.LevelMatchFilter | An exact match to the event's level. |
log4net.Filter.LevelRangeFilter | Matches against a range of levels. |
log4net.Filter.LoggerMatchFilter | Matches against a the start of the logger name. |
log4net.Filter.PropertyFilter | Matches a substring from a specific property value. |
log4net.Filter.StringMatchFilter | Matches a substring from the event's message. |
The filters can be configured to either accept or reject the event based upon the match.
Appender元素里的<Layouts>标签
The following layouts are included in the log4net package:
Type | Description |
---|---|
log4net.Layout.ExceptionLayout | Renders the exception text from the logging event. |
log4net.Layout.PatternLayout | Formats the logging event according to a flexible set of formatting flags. |
log4net.Layout.RawTimeStampLayout | Extracts the timestamp from the logging event. |
log4net.Layout.RawUtcTimeStampLayout | Extracts the timestamp from the logging event in Universal Time. |
log4net.Layout.SimpleLayout | Formats the logging event very simply: [level] - [message] |
log4net.Layout.XmlLayout | Formats the logging event as an XML element. |
log4net.Layout.XmlLayoutSchemaLog4j | Formats the logging event as an XML element that complies with the log4j event dtd. |
这里了解下:log4net.Layout.PatternLayout中的转换模式(ConversionPattern)
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,例如:
模式字符串为:%-10c -%m%n
代码为:
ILog log=LogManager.GetLogger(“Exam.Log”);
log.Debug(“Hello”);
则输出为下面的形式:
Exam.Log - Hello
%L:输出语句所在的行号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,若是不够,则用空格填充
例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成相似于如下内容的输出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
全文借鉴:http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html