前提題要:因為我最近負責的Winform項目,好多都用到了這個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".log"" /> 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>
第三步、
如果是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