<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
log4net庫是Apache log4j框架在Microsoft .NET平臺的實現,是一個幫助程式設計師將紀錄檔資訊輸出到各種目標(控制檯、檔案、資料庫等)的工具。
Apache log4net ™,最新版本log4net 2.0.8
log4net 有四種主要的元件,分別是Logger(記錄器), Repository(庫), Appender(附著器)以及 Layout(佈局)。
如果沒有定義LEVEL的值,則預設為DEBUG。
比如:定義一個紀錄檔物件,設定級別為INFO,表示比INFO級別高(或相等)的紀錄檔將被記錄。即log.Info(“XX”)將記錄,log.Debug(“**”)不記錄
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="Logpamsdc" /> <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>
設定資訊一般放在單獨的組態檔中,也可以放在在程式的組態檔裡,如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>
Logger是應用程式需要互動的主要元件,它用來產生紀錄檔訊息。產生的紀錄檔訊息並不直接顯示,還要預先經過Layout的格式化處理後才會輸出。
Logger提供了多種方式來記錄一個紀錄檔訊息,你可以在你的應用程式裡建立多個Logger,每個範例化的Logger物件都被log4net框架作為命名實體(named entity)來維護。這意味著為了重用Logger物件,你不必將它在不同的類或物件間傳遞,只需要用它的名字為引數呼叫就可以了。
log4net框架使用繼承體系,在框架的體系裡所有的紀錄檔物件都是根紀錄檔(root logger)的後代。也就是說,如果有兩個logger,分別被定義為a.b.c和a.b,那麼我們說a.b是a.b.c的祖先。每一個logger都繼承了祖先的屬性 。這種預設的繼承方式也可以通過顯式地設定標籤的additivity屬性為false而改變。
Log4net框架定義了一個ILog介面,所有的logger類都必須實現這個介面。如果你想實現一個自定義的logger,你必須首先實現這個介面。
Log4net框架定義了一個叫做LogManager的類,用來管理所有的logger物件。它有一個GetLogger()靜態方法,用我們提供的名字引數來檢索已經存在的Logger物件。如果框架裡不存在該Logger物件,它也會為我們建立一個Logger物件。程式碼如下所示:
log4net.ILog log = log4net.LogManager.GetLogger("logger-name");
通常來說,我們會以類(class)的型別(type)為引數來呼叫GetLogger(),以便跟蹤我們正在進行紀錄檔記錄的類。
一個好的紀錄檔框架應該能夠產生多目的地的輸出。比如說輸出到控制檯或儲存到一個紀錄檔檔案。log4net 能夠很好的滿足這些要求。它使用一個叫做Appender的元件來定義輸出媒介。正如名字所示,這些元件把它們附加到Logger紀錄檔元件上並將輸出傳遞到輸出流中。你可以把多個Appender元件附加到一個紀錄檔物件上。 Log4net框架提供了幾個Appender元件。
關於log4net提供的Appender元件的完整列表可以在log4net框架的幫助手冊中找到。有了這些現成的Appender元件,一般來說你沒有必要再自己編寫了。但是如果你願意,可以從log4net.Appender.AppenderSkeleton類繼承。
log4net的各種Appender設定範例
http://logging.apache.org/log4net/release/config-examples.html
輸出方式主要包括:
例如,轉換模式為%r [%t]%-5p %c - %m%n 的 PatternLayout 將生成類似於以下內容的輸出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
當我們建立了上面的組態檔後,我們接下來需要把它和我們的應用聯絡起來。預設的,每個獨立的可執行程式集都會定義它自己的設定。
log4net框架使用 log4net.Config.XmlConfiguratorAttribute在程式集的級別上定義組態檔。
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]//關聯log4net.config檔案 //或者 [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]//關鍵到xxx.exe.log4net或xxx.dll.log4net,並監測變化。
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config")); //或者 log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath(@」Config.log4net.config」)))
紀錄檔物件會使用在組態檔裡定義的Logger的Name屬性。如果某個紀錄檔物件沒有事先在組態檔裡定義,那麼框架會根據繼承結構獲取祖先節點的屬性,最終的,會從根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);
if (log.IsDebugEnabled) log.Debug("message"); if (log.IsInfoEnabled) log.Info("message); log.Logger.Repostory.Shutdown()//關閉紀錄檔
log4net.Repository.Hierarchy.Hierarchy h = (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository(); log4net.Appender.AppenderCollection ac = h.Root.Appenders;
log4net.ILog logger = log4net.LogManager.GetLogger(typeof(_Defaut)); log4net.Appender.AppenderCollection ac = ((log4net.Repository.Hierarchy.Logger)logger.Logger).Appenders;
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";//程式執行時動態的設定log紀錄檔的檔名 rfa.Writer = new System.IO.StreamWriter(rfa.File, rfa.AppendToFile, rfa.Encoding); } }
紀錄檔儲存於記憶體中,到一定閾值之後才將資料post到伺服器,同時可設定伺服器端接受資料的地址
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)); } } }
(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();
到此這篇關於C#使用紀錄檔元件log4net的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45