1. 程式人生 > >Winfrom學習之隨筆一:Log4net

Winfrom學習之隨筆一:Log4net

閱讀 eventlog ger 內容 無法 man 數據庫 ttr 繼承體系

前提題要:因為我最近負責的Winfrom項目,好多都用到了這個log4net的日誌功能,開發程序對數據一般都要求做到雁過留痕,所以日誌對於我們程序員是不可或缺。因此我把對log4net的使用做一個記錄總結,以便於以後的使用記憶。l

一、概述

log4net是.Net下一個非常優秀的開源日誌記錄組件。 他是apache組織下面的一個工程,詳見Apache介紹:https://baike.baidu.com/item/Apache軟件基金會/2912769?fr=aladdin, log4net記錄日誌的功能非常強大。它可以將日誌分不同的等級,以不同的格式,輸出到不同的媒介。

二、一個小的案例實現過程

第一步、在項目中添加對log4net的引用,如果沒有的話,可以手動在NuGet包裏面尋找下載添加

第二步、設置配置文件

這個是我的winfrom裏面的配置,供參考

技術分享圖片
 1  <configSections>
 2     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
 3   </configSections>
 4   <startup useLegacyV2RuntimeActivationPolicy="
true"> 5 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> 6 </startup> 7 8 <log4net> 9 <root> 10 <level value="WARN" /> 11 <appender-ref ref="LogFileAppender" /> 12 <appender-ref ref="ConsoleAppender" /> 13
</root> 14 <logger name="Logging"> 15 <level value="DEBUG" /> 16 </logger> 17 <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 18 <file value="Logs/" /> 19 <appendToFile value="true" /> 20 <rollingStyle value="Date" /> 21 <datePattern value="yyyy-MM-dd&quot;.log&quot;" /> 22 <maxSizeToRollBackups value="-1" /> 23 <maximumFileSize value="100MB" /> 24 <staticLogFileName value="false" /> 25 <layout type="log4net.Layout.PatternLayout,log4net"> 26 <conversionPattern value="%d - %-5level - %c - %m%n" /> 27 </layout> 28 29 <filter type="log4net.Filter.LevelRangeFilter"> 30 <param name="LevelMin" value="DEBUG" /> 31 <param name="LevelMax" value="WARN" /> 32 </filter> 33 </appender> 34 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 35 <layout type="log4net.Layout.PatternLayout"> 36 <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> 37 </layout> 38 </appender> 39 </log4net>
View Code

第三步

如果是CS程序,在根目錄的Program.cs中的Main方法中添加:

log4net.Config.XmlConfigurator.Configure();

如果是BS程序,在根目錄的Global.asax.cs(沒有新建一個)中的Application_Start方法中添加:

log4net.Config.XmlConfigurator.Configure();

無論BS還是CS程序都可直接在項目的AssemblyInfo.cs文件裏添加以下的語句:

[assembly: log4net.Config .XmlConfigurator()]

第四步、聲明一個日誌容器

技術分享圖片

我在配置文件中是這樣設置的:技術分享圖片

第五步、在程序中使用

技術分享圖片

三、主要的組成部分

1.Appenders

Appenders用來定義日誌的輸出方式,即日誌要寫到那種介質上去。較常用的Log4net已經實現好了,直接在配置文件中調用即可,可參見上面配置文件例子;當然也可以自己寫一個,需要從 log4net.Appender.AppenderSkeleton類繼承。它還可以通過配置Filters和Layout來實現日誌的過濾和輸出格式。

已經實現的輸出方式有:

AdoNetAppender 將日誌記錄到數據庫中。可以采用SQL和存儲過程兩種方式。

AnsiColorTerminalAppender 將日誌高亮輸出到ANSI終端。

AspNetTraceAppender 能用asp.net中Trace的方式查看記錄的日誌。

BufferingForwardingAppender 在輸出到子Appenders之前先緩存日誌事件。

ConsoleAppender 將日誌輸出到應用程序控制臺。

EventLogAppender 將日誌寫到Windows Event Log。

FileAppender 將日誌輸出到文件。

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將日誌寫到遠程接收端。

RollingFileAppender 將日誌以回滾文件的形式寫到文件中。

SmtpAppender 將日誌寫到郵件中。

SmtpPickupDirAppender 將消息以文件的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發送它們。

TelnetAppender 客戶端通過Telnet來接受日誌事件。

TraceAppender 將日誌寫到.NET trace 系統。

UdpAppender 將日誌以無連接UDP數據報的形式送到遠程宿主或用UdpClient的形式廣播。

2.Filters

使用過濾器可以過濾掉Appender輸出的內容。過濾器通常有以下幾種:

DenyAllFilter 阻止所有的日誌事件被記錄

LevelMatchFilter 只有指定等級的日誌事件才被記錄

LevelRangeFilter 日誌等級在指定範圍內的事件才被記錄

LoggerMatchFilter 與Logger名稱匹配,才記錄

PropertyFilter 消息匹配指定的屬性值時才被記錄

StringMathFilter 消息匹配指定的字符串才被記錄

3.Layouts

Layout用於控制Appender的輸出格式,可以是線性的也可以是XML。

一個Appender只能有一個Layout。

最常用的Layout應該是經典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然後還有IRawLayout,XMLLayout等幾個,使用較少。Layout可以自己實現,需要從log4net.Layout.LayoutSkeleton類繼承,來輸出一些特殊需要的格式,在後面擴展時就重新實現了一個Layout。

SimpleLayout簡單輸出格式,只輸出日誌級別與消息內容。

RawTimeStampLayout 用來格式化時間,在向數據庫輸出時會用到。

樣式如“yyyy-MM-dd HH:mm:ss“

ExceptionLayout需要給Logger的方法傳入Exception對象作為參數才起作用,否則就什麽也不輸出。輸出的時候會包含Message和Trace。

PatterLayout使用最多的一個Layout,能輸出的信息很多。

4.Loggers

Logger是直接和應用程序交互的組件。Logger只是產生日誌,然後由它引用的Appender記錄到指定的媒介,並由Layout控制輸出格式。

Logger提供了多種方式來記錄一個日誌消息,也可以有多個Logger同時存在。每個實例化的Logger對象對被log4net作為命名實體(Named Entity)來維護。log4net使用繼承體系,也就是說假如存在兩個Logger,名字分別為a.b.c和a.b。那麽a.b就是a.b.c的祖先。每個Logger都繼承了它祖先的屬性。所有的Logger都從Root繼承,Root本身也是一個Logger。

日誌的等級,它們由高到底分別為:

OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL

高於等級設定值方法(如何設置參見“配置文件詳解”)都能寫入日誌, Off所有的寫入方法都不寫到日誌裏,ALL則相反。例如當我們設成Info時,logger.Debug就會被忽略而不寫入文件,但是FATAL,ERROR,WARN,INFO會被寫入,因為他們等級高於INFO。

在具體寫日誌時,一般可以這樣理解日誌等級:

FATAL(致命錯誤):記錄系統中出現的能使用系統完全失去功能,服務停止,系統崩潰等使系統無法繼續運行下去的錯誤。例如,數據庫無法連接,系統出現死循環。

ERROR(一般錯誤):記錄系統中出現的導致系統不穩定,部分功能出現混亂或部分功能失效一類的錯誤。例如,數據字段為空,數據操作不可完成,操作出現異常等。

WARN(警告):記錄系統中不影響系統繼續運行,但不符合系統運行正常條件,有可能引起系統錯誤的信息。例如,記錄內容為空,數據內容不正確等。

INFO(一般信息):記錄系統運行中應該讓用戶知道的基本信息。例如,服務開始運行,功能已經開戶等。

DEBUG (調試信息):記錄系統用於調試的一切信息,內容或者是一些關鍵數據內容的輸出。

Logger實現的ILog接口,ILog定義了5個方法(Debug,Inof,Warn,Error,Fatal)分別對不同的日誌等級記錄日誌。這5個方法還有5個重載。以Debug為例說明一下,其它的和它差不多。

ILog中對Debug方法的定義如下:

void Debug(object message);

void Debug(object message, Exception ex);

還有一個布爾屬性:

bool IsDebugEnabled { get; }

如果使用Debug(object message, Exception ex),則無論Layout中是否定義了%exception,默認配置下日誌都會輸出Exception。包括Exception的Message和Trace。如果使用Debug(object message),則日誌是不會輸出Exception。

最後還要說一個LogManager類,它用來管理所有的Logger。它的GetLogger靜態方法,可以獲得配置文件中相應的Logger:

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");

5.Object Renders

它將告訴logger如何把一個對象轉化為一個字符串記錄到日誌裏。(ILog中定義的接口接收的參數是Object,而不是String。)

例如你想把Orange對象記錄到日誌中,但此時logger只會調用Orange默認的ToString方法而已。所以要定義一個OrangeRender類實現log4net.ObjectRender.IObjectRender接口,然後註冊它(我們在本文中的擴展不使用這種方法,而是直接實現一個自定義的Layout)。這時logger就會知道如何把Orange記錄到日誌中了。

6.Repository

Repository主要用於日誌對象組織結構的維護。

PS來源:https://blog.csdn.net/binnygoal/article/details/79557746

Winfrom學習之隨筆一:Log4net