1. 程式人生 > >WinForm中log4net配置說明和使用

WinForm中log4net配置說明和使用

    由於最近在WinForm專案中用到log4net便查閱了相關資料。但發現關於log4net的文章很多,但說的太簡陋了,經過實踐後現把總結一下。內容如下:

     1.log4net的介紹

        log4net(Log For Net)是Apache開源的應用於.Net框架的日誌記錄工具,詳細資訊參見Apache網站.它是針對Java的log4j(Log For Java的)姊妹工具.用過log4j的都知道,它功能強大,可配置性靈活,執行緒安全,對日誌的輸出管理和級別管理方便。使用log4net需要知道其中兩個比較重要的概念:logger 和 appender。前者是日誌記錄物件,後者是日誌記錄的目標載體,包括控制檯,檔案,定量大小的檔案,遠端廣播。log4net的工作原理簡單地說是這樣的:獲得一個用來記錄日誌的工具物件logger,然後為logger物件指定日誌的記錄位置。值得一提的是這一切工作都可以在應用程式的配置檔案中完成,所需程式碼量極少。

     2.配置檔案說明

       簡單的拿一個配置檔案來舉例說明:--後邊的文字表示註釋內容

       <configuration>
         <configSections>  --在配置選項中加入log4net的引用
          <section type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
         </configSections>
         <log4net>
         <appender  >LogFile" type="log4net.Appender.RollingFileAppender,log4net" >
          <param value="log.txt" /> --定義用檔案來儲存日誌,生成的檔案log.txt和應用程式生成的exe檔案在同一目錄下。


          <param value="false" />
          <param value="Date" />
          <param value="yyyy.MM.dd" />
          <param value="true" />
          <layout type="log4net.Layout.PatternLayout,log4net">--定義輸出風格
          <param value="%d [%t] %-5p %c - %m%n" />
          <param value="&#13;&#10;----------------------header--------------------------&#13;&#10;" />
          <param value="&#13;&#10;----------------------footer--------------------------&#13;&#10;" />
          </layout>
        </appender>

        <appender>

        --一個配置檔案可以有很多appender,一個appender節就相當於一個日誌輸出介質或方法。

        </appender>
       <logger >logApp"> --定義logger物件的名字為logApp,以方便在程式碼中使用,<logger>配置項可以不配置 
        <level value="ALL" />--定義輸出的資訊等級為所有其中包括Fatal.Error.Warn.Info.Debug
       </logger>
       <root>--定義日誌輸出的方式和等級
        <level value="INFO" />
       <appender-ref ref="LogFile" />--選擇了檔案輸出,注意粗體部分對應的名稱
       </root>
      </log4net>
     </configuration>

     3.Log4net的使用。

       使用步驟:

  • 在專案中新增log4net.dll的引用。
  • 關聯配置檔案。
  • 建立Ilog例項,便可以使用了。

      說明:關聯配置檔案一般是通過在AssemblyInfo.cs檔案裡新增以下的語句

             [assembly:log4net.Config.DOMConfigurator(ConfigFile="filename", ConfigFileExtension="ext",Watch=true/false)] 引數可以省略

             ConfigFile:指出了我們的配置檔案的路徑及檔名,包括副檔名。可省略

             ConfigFileExtension:如果我們對被編譯程式的程式集使用了不同的副檔名,那麼我們需要定義這個屬性,預設的,程式集的配置副檔名為”config”。

             Watch (Boolean屬性): log4net框架用這個屬性來確定是否需要在執行時監視檔案的改變。如果這個屬性為true,那麼FileSystemWatcher將會被用來監視檔案的改變,重新命名 ,刪除等事件。

     建立例項的方法:

        Log4net框架定義了一個叫做LogManager的類,用來管理所有的logger物件。它有一個GetLogger()靜態方法,用我們提供的名字引數來檢索已經存在的Logger物件。如果框架裡不存在該Logger物件,它也會為我們建立一個Logger物件。如:ILog log = LogManager.GetLogger("logApp") //logApp是配置檔案中<logger>定義的name屬性值。

       我們會以類(class)的型別(type)為引數來呼叫GetLogger(),以便跟蹤我們正在進行日誌記錄的類。傳遞的類(class)的型別(type)可以用typeof(Classname)方法來獲得。

       如:ILog log = LogManager.GetLogger(this.GetType())//this.GetType()只限於部分地方可以這樣寫,最好用typeof(classname)。

       最後就可以使用建立後的例項了。如:log.Info("執行××××方法開始"), log.Error("****")等

     到此你就可以輕鬆使用log4net了,下一篇會給出一些配置資訊的詳細說明。歡迎大家提出建議。


介紹一下各配置資訊

     1.Appenders

Appenders用來定義日誌的輸出方式。它還可以通過配置Filters和Layout來實現日誌的過濾和輸出格式。

它的輸出方式有:

  • AdoNetAppender 將日誌記錄到資料庫中。可以採用SQL和儲存過程兩種方式。
  • AnsiColorTerminalAppender 將日誌高亮輸出到ANSI終端。
  • AspNetTraceAppender  能用asp.net中Trace的方式檢視記錄的日誌。
  • BufferingForwardingAppender 在輸出到子Appenders之前先快取日誌事件。
  • ConsoleAppender 將日誌輸出到應用程式控制臺。
  • EventLogAppender 將日誌寫到Windows Event Log。
  • FileAppender 將日誌輸出到檔案。
  • RollingFileAppender 將日誌以回滾檔案的形式寫到檔案中。
  • ForwardingAppender 傳送日誌事件到子Appenders。
  • LocalSyslogAppender 將日誌寫到local syslog service (僅用於UNIX環境下)。
  • MemoryAppender 將日誌存到記憶體緩衝區。
  • NetSendAppender 將日誌輸出到Windows Messenger service.這些日誌資訊將在使用者終端的對話方塊中顯示。
  • OutputDebugStringAppender 將日誌輸出到Debuger,如果程式沒有Debuger,就輸出到系統Debuger。如果系統Debuger也不可用,將忽略訊息。
  • RemoteSyslogAppender 通過UDP網路協議將日誌寫到Remote syslog service。
  • RemotingAppender 通過.NET Remoting將日誌寫到遠端接收端。
  • SmtpAppender 將日誌寫到郵件中。
  • SmtpPickupDirAppender 將訊息以檔案的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或傳送它們。
  • TelnetAppender 客戶端通過Telnet來接受日誌事件。
  • TraceAppender 將日誌寫到.NET trace 系統。
  • UdpAppender 將日誌以無連線UDP資料報的形式送到遠端宿主或用UdpClient的形式廣播。

共20種,使用時主要體現在type屬性上 如 <appender  type="log4net.Appender.RollingFileAppender,log4net" />     <appender  type="log4net.Appender.ConsoleAppender,log4net" >。注意加粗部分。具體使用哪種方式就要看具體需求了。

     2. Layouts

Layout用於控制Appender的輸出格式,可以使線性的也可以使XML。一個Appender只能有一個Layout。下面以列表的格式來給出具體的說明。

表示式 含義
a 等價於appdomain
appdomain 引發日誌事件的應用程式域的友好名稱。(我在使用中一般是可執行檔案的名字。)
c 等價於 logger
C 等價於 type
class 等價於 type
d 等價於 date
date

發生日誌事件的本地時間。 使用 DE>%utcdate 輸出UTC時間。date後面還可以跟一個日期格式,用大括號括起來。DE>例如:%date{HH:mm:ss,fff}或者%date{dd MMM yyyy HH:mm:ss,fff}。如果date後面什麼也不跟,將使用ISO8601 格式 。

日期格式和.Net中DateTime類的ToString方法中使用的格式是一樣。

另外log4net還有3個自己的格式Formatter。 它們是 "ABSOLUTE", "DATE"和"ISO8601"分別代表 AbsoluteTimeDateFormatter, DateTimeDateFormatterIso8601DateFormatter。例如: %date{ISO8601}%date{ABSOLUTE}

它們的效能要好於ToString。

exception

異常資訊

日誌事件中必須存了一個異常物件,如果日誌事件不包含沒有異常物件,將什麼也不輸出。異常輸出完畢後會跟一個換行。一般會在輸出異常前加一個換行,並將異常放在最後。

F 等價於 file
file

發生日誌請求的原始碼檔案的名字。

警告:只在除錯的時候有效。呼叫本地資訊會影響效能。

identity

當前活動使用者的名字(Principal.Identity.Name).

警告:會影響效能。(我測試的時候%identity返回都是空的。)

l 等價於 location
L 等價於 line
location

引發日誌事件的方法(包括名稱空間和類名),以及所在的原始檔和行號。

警告:會影響效能。沒有pdb檔案的話,只有方法名,沒有原始檔名和行號。

level

日誌事件等級

line

引發日誌事件的行號

警告:會影響效能。

logger

記錄日誌事件的Logger物件的名字。

可以使用精度說明符控制Logger的名字的輸出層級,預設輸出全名。

注意,精度符的控制是從右開始的。例如:logger 名為 "a.b.c", 輸出模型為 %logger{2} ,將輸出"b.c"。

m 等價於 message
M 等價於 method
message

由應用程式提供給日誌事件的訊息。

mdc

MDC (舊為:ThreadContext.Properties) 現在是事件屬性的一部分。 保留它是為了相容性,它等價於 property

method

發生日誌請求的方法名(只有方法名而已)。

警告:會影響效能。

n 等價於 newline
newline

換行符

ndc

NDC (nested diagnostic context)

p 等價於 level
P 等價於 property
properties 等價於 property
property

輸出事件的特殊屬性。例如: %property{user} 輸出user屬性。屬性是由loggers或appenders新增到時間中的。 有一個預設的屬性"DE>log4net:HostName"總是會有。DE>

%property將輸出所以的屬性 。

(我除了知道可以用它獲得主機名外,還不知道怎麼用。)

r 等價於 timestamp
t 等價於 thread
timestamp

從程式啟動到事件發生所經過的毫秒數。

thread

引發日誌事件的執行緒,如果沒有執行緒名就使用執行緒號。

type

引發日誌請求的類的全名。.

可以使用精度控制符。例如: 類名是 "log4net.Layout.PatternLayout", 格式模型是 %type{1} 將輸出"PatternLayout"。(也是從右開始的。)

警告:會影響效能。

u 等價於 identity
username

當前使用者的WindowsIdentity。(類似:HostName\Username)

警告:會影響效能。

utcdate

發生日誌事件的UTC時間。DE>後面還可以跟一個日期格式,用大括號括起來。DE>例如:%utcdate{HH:mm:ss,fff}或者%utcdate{dd MMM yyyy HH:mm:ss,fff}。如果utcdate後面什麼也不跟,將使用ISO8601 格式 。

日期格式和.Net中DateTime類的ToString方法中使用的格式是一樣。

另外log4net還有3個自己的格式Formatter。 它們是 "ABSOLUTE", "DATE"和"ISO8601"分別代表 AbsoluteTimeDateFormatter, DateTimeDateFormatterIso8601DateFormatter。例如: %date{ISO8601}%date{ABSOLUTE}

它們的效能要好於ToString。

w 等價於 username
x 等價於 ndc
X 等價於 mdc
%

%%輸出一個百分號

其它的一些配置資訊就不多說了。

     總結:個人建議最好不要直接使用log4net,我們可以通過Common.Logging.dll提供介面來使用log4net。畢竟介面的靈活性要比類高。