首先感慨下,如今的程序員作的工做由於高級語言的生產力,系統框架模式的成熟,開源大牛的貢獻,已經成愈來愈偏向 「面向配置編程」了......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