C#使用日志組件log4net
一、概述
log4net庫(kù)是Apache log4j框架在Microsoft .NET平臺(tái)的實(shí)現(xiàn),是一個(gè)幫助程序員將日志信息輸出到各種目標(biāo)(控制臺(tái)、文件、數(shù)據(jù)庫(kù)等)的工具。
1、下載與版本
Apache log4net ™,最新版本log4net 2.0.8
2、Log4net的結(jié)構(gòu)
log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫(kù)), Appender(附著器)以及 Layout(布局)。
3、日志的級(jí)別
如果沒(méi)有定義LEVEL的值,則缺省為DEBUG。
- OFF 級(jí)別最高
- FATAL
- RROR
- WARN
- INFO
- DEBUG 缺省
- ALL 級(jí)別最低
比如:定義一個(gè)日志對(duì)象,設(shè)置級(jí)別為INFO,表示比INFO級(jí)別高(或相等)的日志將被記錄。即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 致命錯(cuò)誤" />
<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 線(xiàn)程:[%thread] 級(jí)別: %-5level 類(lèi):%logger [%ndc] < %property{auth}> - 消息:%message%newline" />
</layout>
</appender>
</log4net>1、配置文件
配置信息一般放在單獨(dú)的配置文件中,也可以放在在程序的配置文件里,如app.config 或web.config. 或者任意文件中。
log4net框架會(huì)在相對(duì)于AppDomain.CurrentDomain.BaseDirectory 屬性定義的目錄路徑下查找配置文件。
框架在配置文件里要查找的唯一標(biāo)識(shí)是標(biāo)簽。一個(gè)完整的配置文件的例子如下:
<?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是應(yīng)用程序需要交互的主要組件,它用來(lái)產(chǎn)生日志消息。產(chǎn)生的日志消息并不直接顯示,還要預(yù)先經(jīng)過(guò)Layout的格式化處理后才會(huì)輸出。
Logger提供了多種方式來(lái)記錄一個(gè)日志消息,你可以在你的應(yīng)用程序里創(chuàng)建多個(gè)Logger,每個(gè)實(shí)例化的Logger對(duì)象都被log4net框架作為命名實(shí)體(named entity)來(lái)維護(hù)。這意味著為了重用Logger對(duì)象,你不必將它在不同的類(lèi)或?qū)ο箝g傳遞,只需要用它的名字為參數(shù)調(diào)用就可以了。
log4net框架使用繼承體系,在框架的體系里所有的日志對(duì)象都是根日志(root logger)的后代。也就是說(shuō),如果有兩個(gè)logger,分別被定義為a.b.c和a.b,那么我們說(shuō)a.b是a.b.c的祖先。每一個(gè)logger都繼承了祖先的屬性 。這種缺省的繼承方式也可以通過(guò)顯式地設(shè)定標(biāo)簽的additivity屬性為false而改變。
Log4net框架定義了一個(gè)ILog接口,所有的logger類(lèi)都必須實(shí)現(xiàn)這個(gè)接口。如果你想實(shí)現(xiàn)一個(gè)自定義的logger,你必須首先實(shí)現(xiàn)這個(gè)接口。
Log4net框架定義了一個(gè)叫做LogManager的類(lèi),用來(lái)管理所有的logger對(duì)象。它有一個(gè)GetLogger()靜態(tài)方法,用我們提供的名字參數(shù)來(lái)檢索已經(jīng)存在的Logger對(duì)象。如果框架里不存在該Logger對(duì)象,它也會(huì)為我們創(chuàng)建一個(gè)Logger對(duì)象。代碼如下所示:
log4net.ILog log = log4net.LogManager.GetLogger("logger-name");通常來(lái)說(shuō),我們會(huì)以類(lèi)(class)的類(lèi)型(type)為參數(shù)來(lái)調(diào)用GetLogger(),以便跟蹤我們正在進(jìn)行日志記錄的類(lèi)。
3、Appender
一個(gè)好的日志框架應(yīng)該能夠產(chǎn)生多目的地的輸出。比如說(shuō)輸出到控制臺(tái)或保存到一個(gè)日志文件。log4net 能夠很好的滿(mǎn)足這些要求。它使用一個(gè)叫做Appender的組件來(lái)定義輸出介質(zhì)。正如名字所示,這些組件把它們附加到Logger日志組件上并將輸出傳遞到輸出流中。你可以把多個(gè)Appender組件附加到一個(gè)日志對(duì)象上。 Log4net框架提供了幾個(gè)Appender組件。
關(guān)于log4net提供的Appender組件的完整列表可以在log4net框架的幫助手冊(cè)中找到。有了這些現(xiàn)成的Appender組件,一般來(lái)說(shuō)你沒(méi)有必要再自己編寫(xiě)了。但是如果你愿意,可以從log4net.Appender.AppenderSkeleton類(lèi)繼承。
log4net的各種Appender配置示例
http://logging.apache.org/log4net/release/config-examples.html
輸出方式主要包括:
- AdoNetAppender:將日志記錄到數(shù)據(jù)庫(kù)中??梢圆捎肧QL和存儲(chǔ)過(guò)程兩種方式
- AspNetTraceAppender:能用ASP.NET中跟蹤的方式查看記錄的日志。
- BufferingForwardingAppender:在輸出到子Appenders之前先緩存日志事件。
- ColoredConsoleAppender:在終端的窗口寫(xiě)下高亮度的日志事件。
- ConsoleAppender:將日志輸出到控制臺(tái)。
- EventLogAppender:將日志寫(xiě)到Windows操作系統(tǒng)的日志中去。
- FileAppender:將日志寫(xiě)到文件中。
- ForwardingAppender:用來(lái)為一個(gè)Appender指定一組約束。
- MemoryAppender:將日志存到內(nèi)存緩沖區(qū)。
- NetSendAppender:將日志輸出到Windows Messenger service,這些日志信息將在用戶(hù)終端的對(duì)話(huà)框中顯示。
- OutputDebugStringAppender:配置該Appender以向OutputDebugString API寫(xiě)入日志。
- RemotingAppender:通過(guò).NET Remoting將日志寫(xiě)到遠(yuǎn)程接收端。
- RollingFileAppender:將日志以回滾文件的形式寫(xiě)到文件中。
- SmtpAppender:將日志寫(xiě)到郵件中。
- SmtpPickupDirAppender:配置與SmtpAppender類(lèi)似,但要把SmtpHost換為PickupDir。
- TraceAppender:將日志寫(xiě)到.NET trace 系統(tǒng)。
- UdpAppender:將日志connectionless UDP datagrams的形式送到遠(yuǎn)程宿主或以UdpClient的形式廣播。
4、PatternLayout中的轉(zhuǎn)換模式
- %F/%file:輸出語(yǔ)句所在的文件名
- %U/%identity:用戶(hù)名
- %l/%location:調(diào)用者位置
- %L/%line:輸出語(yǔ)句所在的行號(hào)
- %M/%method:方法
- %C(class),%class,%type::類(lèi)名
- %w/%username:Windows Identity
- %a/%appdomain:域
- %t/%thread:當(dāng)前語(yǔ)句所在的線(xiàn)程ID
- %c(category), %logger::當(dāng)前日志對(duì)象的名稱(chēng)
- %p(priority),%level:日志的當(dāng)前優(yōu)先級(jí)別,即DEBUG、INFO、WARN…等
- %m/%message:輸出的日志消息,如ILog.Debug(…)輸出的一條消息
- %exception:異常
- %d,%date:輸出當(dāng)前語(yǔ)句運(yùn)行的時(shí)刻,默認(rèn)格式為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小時(shí)小時(shí)24制,hh小時(shí)12小時(shí)制,mm分鐘,ss秒,fff毫秒(f為秒的精確位數(shù),幾個(gè)f代表精確到小數(shù)點(diǎn)后幾位)
- %r/%timestamp:輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語(yǔ)句時(shí)消耗的毫秒數(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ù)字:表示該項(xiàng)的最小長(zhǎng)度,如果不夠,則用空格填充 。%-10,表示最小長(zhǎng)度為10,如果不夠,則用空格右側(cè)填充;%.10,表示最大長(zhǎng)度為10;可以與%m等其他格式組合使用,示例%10m,%-10m,%10.10m,%-10.10m
- %%:輸出%
例如,轉(zhuǎn)換模式為%r [%t]%-5p %c - %m%n 的 PatternLayout 將生成類(lèi)似于以下內(nèi)容的輸出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
三、定義配置文件
當(dāng)我們創(chuàng)建了上面的配置文件后,我們接下來(lái)需要把它和我們的應(yīng)用聯(lián)系起來(lái)。缺省的,每個(gè)獨(dú)立的可執(zhí)行程序集都會(huì)定義它自己的配置。
log4net框架使用 log4net.Config.XmlConfiguratorAttribute在程序集的級(jí)別上定義配置文件。
- ConfigFile:指出了我們的配置文件的路徑及文件名,包括擴(kuò)展名。
- ConfigFileExtension:如果我們對(duì)被編譯程序的程序集使用了不同的文件擴(kuò)展名,那么我們需要定義這個(gè)屬性,缺省的,程序集的配置文件擴(kuò)展名為”config”。
- Watch (Boolean屬性): log4net框架用這個(gè)屬性來(lái)確定是否需要在運(yùn)行時(shí)監(jiān)視文件的改變。如果這個(gè)屬性為true,那么FileSystemWatcher將會(huì)被用來(lái)監(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)測(cè)變化。
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寫(xiě)日志
1、創(chuàng)建或獲取日志對(duì)象
日志對(duì)象會(huì)使用在配置文件里定義的Logger的Name屬性。如果某個(gè)日志對(duì)象沒(méi)有事先在配置文件里定義,那么框架會(huì)根據(jù)繼承結(jié)構(gòu)獲取祖先節(jié)點(diǎn)的屬性,最終的,會(huì)從根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設(shè)置
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設(shè)置
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";//程序運(yùn)行時(shí)動(dòng)態(tài)的設(shè)定log日志的文件名
rfa.Writer = new System.IO.StreamWriter(rfa.File, rfa.AppendToFile, rfa.Encoding);
}
}六、自定義appender
日志保存于內(nèi)存中,到一定閾值之后才將數(shù)據(jù)post到服務(wù)器,同時(shí)可配置服務(wù)端接受數(shù)據(jù)的地址
1、定義myMemAppender類(lèi)
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、注冊(cè)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的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity?UGUI的VerticalLayoutGroup垂直布局組件介紹使用
這篇文章主要為大家介紹了Unity?UGUI的VerticalLayoutGroup垂直布局組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
使用數(shù)字簽名實(shí)現(xiàn)數(shù)據(jù)庫(kù)記錄防篡改(Java實(shí)現(xiàn))
本文主要介紹了Java中使用數(shù)字簽名實(shí)現(xiàn)數(shù)據(jù)庫(kù)記錄防篡改的方法與步驟。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
c# 接口interface基礎(chǔ)入門(mén)小例子
用于描述類(lèi)的功能,類(lèi)似于契約,指示了類(lèi)將:執(zhí)行的工作,形參類(lèi)型,返回結(jié)果類(lèi)型,但本身沒(méi)有執(zhí)行的代碼2013-04-04
解析C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)
這篇文章主要介紹了C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù),是C#入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01
Unity3D開(kāi)發(fā)教程:憤怒的小鳥(niǎo)
這篇文章詳細(xì)的講解了如何從0開(kāi)發(fā)出一個(gè)Unity3D的小游戲憤怒的小鳥(niǎo),本文包含大量的圖片與文字描述,也含有大量的源代碼,可以讓你快速入手,希望本篇文章對(duì)你有所幫助2021-06-06

