C#使用日志組件log4net
一、概述
log4net庫是Apache log4j框架在Microsoft .NET平臺的實現(xiàn),是一個幫助程序員將日志信息輸出到各種目標(控制臺、文件、數(shù)據(jù)庫等)的工具。
1、下載與版本
Apache log4net ™,最新版本log4net 2.0.8
2、Log4net的結(jié)構(gòu)
log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫), Appender(附著器)以及 Layout(布局)。
3、日志的級別
如果沒有定義LEVEL的值,則缺省為DEBUG。
- OFF 級別最高
- FATAL
- RROR
- WARN
- INFO
- DEBUG 缺省
- ALL 級別最低
比如:定義一個日志對象,設置級別為INFO,表示比INFO級別高(或相等)的日志將被記錄。即log.Info(“XX”)將記錄,log.Debug(“**”)不記錄
二、建立log4net配置文件
config/log4net.config文件:
<log4net> <root> <level value="INFO" /> <appender-ref ref="RollingFileAppender" /> <appender-ref ref="ColoredConsoleAppender" /> </root> <logger name="MessageHandler"> <level value="ERROR" /> <appender-ref ref="SmtpAppender" /> </logger> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="Log\pamsdc" /> <threshold value="INFO" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <datePattern value="yyyyMMdd" /> <maxSizeRollBackups value="100"></maxSizeRollBackups> <layout type="log4net.Layout.PatternLayout"> <header value="[Header]" /> <footer value="[Footer]" /> <conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" /> </layout> </appender> <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <mapping> <level value="WARN" /> <foreColor value="White" /> <backColor value="Red, HighIntensity" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <header value="[Header]" /> <footer value="[Footer]" /> <conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" /> </layout> </appender> <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net"> <to value="" /> <from value="GPEHZ-MIS@GoldPeak" /> <subject value="PAMS DC 致命錯誤" /> <smtpHost value="192.50.6.248" /> <bufferSize value="32" /> <lossy value="true" /> <Authentication value="Basic"/> <Username value="GPEHZ-MIS@GoldPeak"/> <Password value=""/> <evaluator type="log4net.Core.LevelEvaluator,log4net"> <threshold value="ERROR" /> </evaluator> <layout type="log4net.Layout.PatternLayout,log4net"> <conversionPattern value="日期:%date 線程:[%thread] 級別: %-5level 類:%logger [%ndc] < %property{auth}> - 消息:%message%newline" /> </layout> </appender> </log4net>
1、配置文件
配置信息一般放在單獨的配置文件中,也可以放在在程序的配置文件里,如app.config 或web.config. 或者任意文件中。
log4net框架會在相對于AppDomain.CurrentDomain.BaseDirectory 屬性定義的目錄路徑下查找配置文件。
框架在配置文件里要查找的唯一標識是標簽。一個完整的配置文件的例子如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net-net-1.0" /> </configSections> <log4net> .. </log4net> </configuration>
2、Logger
Logger是應用程序需要交互的主要組件,它用來產(chǎn)生日志消息。產(chǎn)生的日志消息并不直接顯示,還要預先經(jīng)過Layout的格式化處理后才會輸出。
Logger提供了多種方式來記錄一個日志消息,你可以在你的應用程序里創(chuàng)建多個Logger,每個實例化的Logger對象都被log4net框架作為命名實體(named entity)來維護。這意味著為了重用Logger對象,你不必將它在不同的類或?qū)ο箝g傳遞,只需要用它的名字為參數(shù)調(diào)用就可以了。
log4net框架使用繼承體系,在框架的體系里所有的日志對象都是根日志(root logger)的后代。也就是說,如果有兩個logger,分別被定義為a.b.c和a.b,那么我們說a.b是a.b.c的祖先。每一個logger都繼承了祖先的屬性 。這種缺省的繼承方式也可以通過顯式地設定標簽的additivity屬性為false而改變。
Log4net框架定義了一個ILog接口,所有的logger類都必須實現(xiàn)這個接口。如果你想實現(xiàn)一個自定義的logger,你必須首先實現(xiàn)這個接口。
Log4net框架定義了一個叫做LogManager的類,用來管理所有的logger對象。它有一個GetLogger()靜態(tài)方法,用我們提供的名字參數(shù)來檢索已經(jīng)存在的Logger對象。如果框架里不存在該Logger對象,它也會為我們創(chuàng)建一個Logger對象。代碼如下所示:
log4net.ILog log = log4net.LogManager.GetLogger("logger-name");
通常來說,我們會以類(class)的類型(type)為參數(shù)來調(diào)用GetLogger(),以便跟蹤我們正在進行日志記錄的類。
3、Appender
一個好的日志框架應該能夠產(chǎn)生多目的地的輸出。比如說輸出到控制臺或保存到一個日志文件。log4net 能夠很好的滿足這些要求。它使用一個叫做Appender的組件來定義輸出介質(zhì)。正如名字所示,這些組件把它們附加到Logger日志組件上并將輸出傳遞到輸出流中。你可以把多個Appender組件附加到一個日志對象上。 Log4net框架提供了幾個Appender組件。
關(guān)于log4net提供的Appender組件的完整列表可以在log4net框架的幫助手冊中找到。有了這些現(xiàn)成的Appender組件,一般來說你沒有必要再自己編寫了。但是如果你愿意,可以從log4net.Appender.AppenderSkeleton類繼承。
log4net的各種Appender配置示例
http://logging.apache.org/log4net/release/config-examples.html
輸出方式主要包括:
- AdoNetAppender:將日志記錄到數(shù)據(jù)庫中??梢圆捎肧QL和存儲過程兩種方式
- AspNetTraceAppender:能用ASP.NET中跟蹤的方式查看記錄的日志。
- BufferingForwardingAppender:在輸出到子Appenders之前先緩存日志事件。
- ColoredConsoleAppender:在終端的窗口寫下高亮度的日志事件。
- ConsoleAppender:將日志輸出到控制臺。
- EventLogAppender:將日志寫到Windows操作系統(tǒng)的日志中去。
- FileAppender:將日志寫到文件中。
- ForwardingAppender:用來為一個Appender指定一組約束。
- MemoryAppender:將日志存到內(nèi)存緩沖區(qū)。
- NetSendAppender:將日志輸出到Windows Messenger service,這些日志信息將在用戶終端的對話框中顯示。
- OutputDebugStringAppender:配置該Appender以向OutputDebugString API寫入日志。
- RemotingAppender:通過.NET Remoting將日志寫到遠程接收端。
- RollingFileAppender:將日志以回滾文件的形式寫到文件中。
- SmtpAppender:將日志寫到郵件中。
- SmtpPickupDirAppender:配置與SmtpAppender類似,但要把SmtpHost換為PickupDir。
- TraceAppender:將日志寫到.NET trace 系統(tǒng)。
- UdpAppender:將日志connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。
4、PatternLayout中的轉(zhuǎn)換模式
- %F/%file:輸出語句所在的文件名
- %U/%identity:用戶名
- %l/%location:調(diào)用者位置
- %L/%line:輸出語句所在的行號
- %M/%method:方法
- %C(class),%class,%type::類名
- %w/%username:Windows Identity
- %a/%appdomain:域
- %t/%thread:當前語句所在的線程ID
- %c(category), %logger::當前日志對象的名稱
- %p(priority),%level:日志的當前優(yōu)先級別,即DEBUG、INFO、WARN…等
- %m/%message:輸出的日志消息,如ILog.Debug(…)輸出的一條消息
- %exception:異常
- %d,%date:輸出當前語句運行的時刻,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },輸出2015-03-10 14:53:28;也可以%d{ISO8601}輸出2015-03-10 14:51:12,220, %d{DATE}輸出‘10 Mar 2015 14:51:51,318’, %d{ABSOLUTE}輸出14:54:07,943,%d{HH:mm:ss,fff}, %d{dd MM yyyy HH:mm:ss,fff},yyyy年份,MM月份,dd日期,HH小時小時24制,hh小時12小時制,mm分鐘,ss秒,fff毫秒(f為秒的精確位數(shù),幾個f代表精確到小數(shù)點后幾位)
- %r/%timestamp:輸出程序從運行到執(zhí)行到當前語句時消耗的毫秒數(shù)
- %X/%mdc:輸出(mapped diagnostic context)mdc上下文內(nèi)容
- %x/%ndc: 輸出(nested diagnostic context)ndc上下文內(nèi)容
- %p/%Proerties{user}:呈現(xiàn)指定屬性
- %n(newline):換行
- %-數(shù)字:表示該項的最小長度,如果不夠,則用空格填充 。%-10,表示最小長度為10,如果不夠,則用空格右側(cè)填充;%.10,表示最大長度為10;可以與%m等其他格式組合使用,示例%10m,%-10m,%10.10m,%-10.10m
- %%:輸出%
例如,轉(zhuǎn)換模式為%r [%t]%-5p %c - %m%n 的 PatternLayout 將生成類似于以下內(nèi)容的輸出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
三、定義配置文件
當我們創(chuàng)建了上面的配置文件后,我們接下來需要把它和我們的應用聯(lián)系起來。缺省的,每個獨立的可執(zhí)行程序集都會定義它自己的配置。
log4net框架使用 log4net.Config.XmlConfiguratorAttribute在程序集的級別上定義配置文件。
- ConfigFile:指出了我們的配置文件的路徑及文件名,包括擴展名。
- ConfigFileExtension:如果我們對被編譯程序的程序集使用了不同的文件擴展名,那么我們需要定義這個屬性,缺省的,程序集的配置文件擴展名為”config”。
- Watch (Boolean屬性): log4net框架用這個屬性來確定是否需要在運行時監(jiān)視文件的改變。如果這個屬性為true,那么FileSystemWatcher將會被用來監(jiān)視文件的改變,重命名,刪除等事件。
1、在Winfrom中,在AssemblyInfo.cs中添加如下代碼:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]//關(guān)聯(lián)log4net.config文件 //或者 [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]//關(guān)鍵到xxx.exe.log4net或xxx.dll.log4net,并監(jiān)測變化。
2、在asp.net中,在Global.asax文件中的Application_Start方法中增加:
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config")); //或者 log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath(@”Config.log4net.config”)))
四、調(diào)用log4net寫日志
1、創(chuàng)建或獲取日志對象
日志對象會使用在配置文件里定義的Logger的Name屬性。如果某個日志對象沒有事先在配置文件里定義,那么框架會根據(jù)繼承結(jié)構(gòu)獲取祖先節(jié)點的屬性,最終的,會從根root日志獲取屬性。如下所示:
Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger"); //或 Log4net.ILog log = Log4net.LogManager.GetLogger(typeof(_Default)); //或 Log4net.ILog log = Log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
2、輸出日志信息
if (log.IsDebugEnabled) log.Debug("message"); if (log.IsInfoEnabled) log.Info("message); log.Logger.Repostory.Shutdown()//關(guān)閉日志
五、更改Appender設置
1、獲取root的Appender
log4net.Repository.Hierarchy.Hierarchy h = (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository(); log4net.Appender.AppenderCollection ac = h.Root.Appenders;
2、獲取指定Logger的Appender:不包括繼承的Appender
log4net.ILog logger = log4net.LogManager.GetLogger(typeof(_Defaut)); log4net.Appender.AppenderCollection ac = ((log4net.Repository.Hierarchy.Logger)logger.Logger).Appenders;
3、更改Appender設置
for (int i = 0; i < ac.Count; i++) { log4net.Appender.RollingFileAppender rfa = ac[i] as log4net.Appender.RollingFileAppender; if (rfa != null) { rfa.File = "xxx.log";//程序運行時動態(tài)的設定log日志的文件名 rfa.Writer = new System.IO.StreamWriter(rfa.File, rfa.AppendToFile, rfa.Encoding); } }
六、自定義appender
日志保存于內(nèi)存中,到一定閾值之后才將數(shù)據(jù)post到服務器,同時可配置服務端接受數(shù)據(jù)的地址
1、定義myMemAppender類
public class MyMemAppender : AppenderSkeleton { private ArrayList eventQueue; public string RemoteAddress { get; set; } public int QueueSize { get; set; } public MyMemAppender() : base() { eventQueue = new ArrayList(); } protected override void Append(log4net.Core.LoggingEvent loggingEvent) { lock (eventQueue.SyncRoot) { eventQueue.Add(loggingEvent); if (eventQueue.Count >= QueueSize) { lock (eventQueue.SyncRoot) { SaveToServer(); eventQueue.Clear(); } } } } private void SaveToServer() { lock (eventQueue.SyncRoot) { List logList = new List(); foreach (log4net.Core.LoggingEvent evt in eventQueue) { try { LogModel m = Newtonsoft.Json.JsonConvert.DeserializeObject(evt.RenderedMessage);//或者evt.MessageObject as LogModel logList.Add(m); } catch (Exception ex) { Console.Write(ex.ToString()); continue; } } //將logList序列化上傳至remoteAddress } } virtual public LoggingEvent[] GetEvents() { lock (eventQueue.SyncRoot) { return (LoggingEvent[])eventQueue.ToArray(typeof(LoggingEvent)); } } }
2、注冊Appender
(1)root根目錄下追加
配置文件方式:
<?xml version="1.0" encoding="utf-8" ?> <log4net debug="true"> <appender name="myMemAppender" type="LogSystem.Common.MyMemAppender"> <param name="QueueSize" value="10"/> <param name="RemoteAddress" value="http://localhost/PostLogData.aspx"/> </appender> <root> <level value="ALL"/> <appender-ref ref="myMemAppender" /> </root> </log4net>
代碼方式:
MyMemAppender appender = new MyMemAppender(); appender.QueueSize = 5; appender.RemoteAddress = "http://localhost:57427/PostLogData.aspx"; log4net.Config.BasicConfigurator.Configure(appender); ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
(2)指定Logger名下追加Appender:
MyMemAppender appender = new MyMemAppender(); appender.Name = "MyMemAppender"; appender.QueueSize = 5; appender.RemoteAddress = "http://localhost:57427/PostLogData.aspx"; Logger logger1 = (Logger)LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); logger1.Level = Level.Info; IAppender appendered = logger1.GetAppender("MyMemAppender"); if (appendered != null) logger1.RemoveAppender("MyMemAppender"); logger1.AddAppender(appendered); appender.ActivateOptions();
到此這篇關(guān)于C#使用日志組件log4net的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity?UGUI的VerticalLayoutGroup垂直布局組件介紹使用
這篇文章主要為大家介紹了Unity?UGUI的VerticalLayoutGroup垂直布局組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改(Java實現(xiàn))
本文主要介紹了Java中使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改的方法與步驟。具有很好的參考價值,下面跟著小編一起來看下吧2017-01-01解析C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)
這篇文章主要介紹了C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù),是C#入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2016-01-01