Log4Net 日志配置[附帶源碼下載]
前述
園子里有許多人對(duì)log4net這款開(kāi)源的日志記錄控件有很多介紹。在這里個(gè)人再做一次總結(jié),希望對(duì)以后有所幫助,需要的時(shí)候可以直接使用,減少查閱資料的時(shí)間。利用log4net可以方便地將日志信息記錄到文件、控制臺(tái)、Windows事件日志和數(shù)據(jù)庫(kù),并且我們還可以記載控制要記載的日志級(jí)別,可以記載的日志類別包括:FATAL(致命錯(cuò)誤)、ERROR(一般錯(cuò)誤)、WARN(警告)、INFO(一般信息)、DEBUG(調(diào)試信息)。log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫(kù)), Appender(附著器)以及 Layout(布局).
準(zhǔn)備工作:
1.下載log4net.dll 下載地址[http://logging.apache.org/log4net/download_log4net.cgi]
下載文件:log4net-1.2.13-bin-newkey.zip。 解壓選擇對(duì)應(yīng)的net版本找到log4net.dll。
2.在項(xiàng)目中引用log4net.dll。
實(shí)例代碼
準(zhǔn)備工作完成后我們來(lái)看下實(shí)例代碼 ,首先在項(xiàng)目中創(chuàng)建一個(gè)文件夾LogConfig。把有關(guān)log4net的一些配置文件和類都放在這個(gè)文件夾里面。
WEB網(wǎng)站為例,在項(xiàng)目LogConfig文件夾中創(chuàng)建Log4Net.config配置文件。
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!--添加自定義節(jié)點(diǎn):log4net type:解析類名,程序集名(log4net.dll)--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--定義輸出到文件中--> <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender"> <!--定義文件存放位置--> <file value="C:/log4net/"/> <!--是否追加到文件,默認(rèn)為true,通常無(wú)需設(shè)置--> <appendToFile value="true"/> <RollingStyle value="Date"/> <!--日期的格式,每天換一個(gè)文件記錄,如不設(shè)置則永遠(yuǎn)只記錄一天的日志,需設(shè)置--> <DatePattern value="INFO_yyyyMMdd".log"" /> <!--日志文件名是否為靜態(tài)--> <StaticLogFileName value="false"/> <!--多線程時(shí)采用最小鎖定--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--布局(向用戶顯示最后經(jīng)過(guò)格式化的輸出信息)--> <layout type="log4net.Layout.PatternLayout"> <!-- %m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息 %n(new line):換行 %d(datetime):輸出當(dāng)前語(yǔ)句運(yùn)行的時(shí)刻 %r(run time):輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語(yǔ)句時(shí)消耗的毫秒數(shù) %t(thread id):當(dāng)前語(yǔ)句所在的線程ID %p(priority): 日志的當(dāng)前優(yōu)先級(jí)別,即DEBUG、INFO、WARN…等 %c(class):當(dāng)前日志對(duì)象的名稱,例如: %L:輸出語(yǔ)句所在的行號(hào) %F:輸出語(yǔ)句所在的文件名 %-數(shù)字:表示該項(xiàng)的最小長(zhǎng)度,如果不夠,則用空格填充 --> <Header value="[Header] "/> <Footer value="[Footer] "/> <!--正文--> <ConversionPattern value="記錄時(shí)間:%date 線程ID:[%thread] 日志級(jí)別:%-5level 出錯(cuò)類:%logger property:[%property{NDC}] - 錯(cuò)誤描述:%message%newline" /> </layout> </appender> <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender"> <file value="C:/log4net/"/> <appendToFile value="true"/> <RollingStyle value="Date"/> <DatePattern value="ERROR_yyyyMMdd".log"" /> <StaticLogFileName value="false"/> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <Header value="[Header] "/> <Footer value="[Footer] "/> <!--正文--> <ConversionPattern value="記錄時(shí)間:%date 線程ID:[%thread] 日志級(jí)別:%-5level 出錯(cuò)類:%logger property:[%property{NDC}] - 錯(cuò)誤描述:%message%newline" /> </layout> </appender> <root> <level value="DEBUG"/> <appender-ref ref="Log4Net_ERROR" /> <level value="INFO"/> <appender-ref ref="Log4Net_INFO" /> </root> </log4net> </configuration>
配置文件寫完后我們?cè)趤?lái)寫一個(gè)Helper類。同樣在項(xiàng)目中創(chuàng)建一個(gè)名為L(zhǎng)ogHelper.cs的類文件。
using log4net; using System; using System.Collections.Concurrent; using System.Collections.Generic; //指定log4net使用的config文件來(lái)讀取配置信息 [assembly: log4net.Config.XmlConfigurator(ConfigFile = @"LogConfig\Log4Net.config", Watch = true)] namespace Project.Log4.Net.LogConfig { /// <summary> /// 日志幫助類 /// </summary> public class LogHelper { private static readonly ConcurrentDictionary<Type, ILog> _loggers = new ConcurrentDictionary<Type, ILog>(); /// <summary> /// 獲取記錄器 /// </summary> /// <param name="source"></param> /// <returns></returns> private static ILog GetLogger(Type source) { if (_loggers.ContainsKey(source)) { return _loggers[source]; } else { ILog logger = LogManager.GetLogger(source); _loggers.TryAdd(source, logger); return logger; } } /* Log a message object */ /// <summary> /// 調(diào)試信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Debug(object source, string message) { Debug(source.GetType(), message); } /// <summary> /// 調(diào)試信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="ps"></param> public static void Debug(object source, string message, params object[] ps) { Debug(source.GetType(), string.Format(message, ps)); } /// <summary> /// 調(diào)試信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Debug(Type source, string message) { ILog logger = GetLogger(source); if (logger.IsDebugEnabled) logger.Debug(message); } /// <summary> /// 關(guān)鍵信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Info(object source, object message) { Info(source.GetType(), message); } /// <summary> /// 關(guān)鍵信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Info(Type source, object message) { ILog logger = GetLogger(source); if (logger.IsInfoEnabled) logger.Info(message); } /// <summary> /// 警告信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Warn(object source, object message) { Warn(source.GetType(), message); } /// <summary> /// 警告信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Warn(Type source, object message) { ILog logger = GetLogger(source); if (logger.IsWarnEnabled) logger.Warn(message); } /// <summary> /// 錯(cuò)誤信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Error(object source, object message) { Error(source.GetType(), message); } /// <summary> /// 錯(cuò)誤信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Error(Type source, object message) { ILog logger = GetLogger(source); if (logger.IsErrorEnabled) logger.Error(message); } /// <summary> /// 失敗信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Fatal(object source, object message) { Fatal(source.GetType(), message); } /// <summary> /// 失敗信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> public static void Fatal(Type source, object message) { ILog logger = GetLogger(source); if (logger.IsFatalEnabled) logger.Fatal(message); } /* Log a message object and exception */ /// <summary> /// 調(diào)試信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Debug(object source, object message, Exception exception) { Debug(source.GetType(), message, exception); } /// <summary> /// 調(diào)試信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Debug(Type source, object message, Exception exception) { GetLogger(source).Debug(message, exception); } /// <summary> /// 關(guān)鍵信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Info(object source, object message, Exception exception) { Info(source.GetType(), message, exception); } /// <summary> /// 關(guān)鍵信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Info(Type source, object message, Exception exception) { GetLogger(source).Info(message, exception); } /// <summary> /// 警告信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Warn(object source, object message, Exception exception) { Warn(source.GetType(), message, exception); } /// <summary> /// 警告信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Warn(Type source, object message, Exception exception) { GetLogger(source).Warn(message, exception); } /// <summary> /// 錯(cuò)誤信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Error(object source, object message, Exception exception) { Error(source.GetType(), message, exception); } /// <summary> /// 錯(cuò)誤信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Error(Type source, object message, Exception exception) { GetLogger(source).Error(message, exception); } /// <summary> /// 失敗信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Fatal(object source, object message, Exception exception) { Fatal(source.GetType(), message, exception); } /// <summary> /// 失敗信息 /// </summary> /// <param name="source"></param> /// <param name="message"></param> /// <param name="exception"></param> public static void Fatal(Type source, object message, Exception exception) { GetLogger(source).Fatal(message, exception); } } }
配置和Helper類都有了..現(xiàn)在來(lái)看看調(diào)用方法。在項(xiàng)目中創(chuàng)建一個(gè)index.aspx頁(yè)面
LogHelper.Debug(this, "Debug"); LogHelper.Error(this, "Error"); LogHelper.Fatal(this, "Fatal"); LogHelper.Info(this, "Info"); LogHelper.Warn(this, "Warn");
日志生成格式[每天一個(gè)文件]:
參數(shù)說(shuō)明
Log4Net.config是配置日志輸出參數(shù)文件。在這個(gè)文件中可以到看很多配置節(jié)點(diǎn),大體可以分為二個(gè)大類<configSections>...</configSections> 和 <log4net>...</log4net>。我們來(lái)看看這些節(jié)點(diǎn)都是啥意思。
1:<configSections>..</configSections>:申明自定義節(jié)點(diǎn)log4net解析的類名和程序集名(log4net.dll)。
2:<log4net>..</log4net>:使用log4net的配置信息都在這里設(shè)置。來(lái)重點(diǎn)看看都有那些設(shè)置信息,這個(gè)大節(jié)點(diǎn)整體也可以分為二類。
2.1:定義輸出信息設(shè)置節(jié)點(diǎn)<appender></appender>。
2.2:定義日志的輸出媒介<root></root>。
配置的總體結(jié)構(gòu)就是這樣,下面來(lái)看一些詳細(xì)內(nèi)容。
appender:決定日志輸出的方式(可設(shè)置多個(gè)節(jié)點(diǎn),如對(duì)INFO,ERROR等設(shè)置不同的輸出方式)。
主要包括已下幾種:
1 AnsiColorTerminalAppender:在ANSI 窗口終端寫下高亮度的日志事件。
2 AspNetTraceAppender:能用asp.net中Trace的方式查看記錄的日志。
3 BufferingForwardingAppender:在輸出到子Appenders之前先緩存日志事件。
4 ConsoleAppender:將日志輸出到控制臺(tái)。
5 EventLogAppender:將日志寫到Windows Event Log.
6 FileAppender:將日志寫到文件中。
7 LocalSyslogAppender:將日志寫到local syslog service (僅用于UNIX環(huán)境下).
8 MemoryAppender:將日志存到內(nèi)存緩沖區(qū)。
9 NetSendAppender:將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對(duì)話框中顯示。
10 RemoteSyslogAppender:通過(guò)UDP網(wǎng)絡(luò)協(xié)議將日志寫到Remote syslog service。
11 RemotingAppender:通過(guò).NET Remoting將日志寫到遠(yuǎn)程接收端。
12 RollingFileAppender:將日志以回滾文件的形式寫到文件中。(實(shí)例代碼中使用的是此類型)
13 SmtpAppender:將日志寫到郵件中。
14 TraceAppender:將日志寫到.NET trace 系統(tǒng)。
15 UdpAppender:將日志connectionless UDP datagrams的形式送到遠(yuǎn)程宿主或以UdpClient的形式廣播。
從上面提供的方式中可以看出能輸出文件、控制臺(tái)、Windows事件日志和數(shù)據(jù)庫(kù)。這個(gè)可根據(jù)實(shí)際情況選擇。
<appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
...
</appender>
這里配置的name(“Log4Net_INFO”)會(huì)在定義日志的輸出媒介中使用到。name可任意設(shè)置。
在appender 節(jié)點(diǎn)中還會(huì)配置一些文件存放的地址,日志個(gè)數(shù)等信息。這些在實(shí)例代碼中都在體現(xiàn),這里不做說(shuō)明。我們?cè)趤?lái)看看日志最后輸出呈現(xiàn)的布局設(shè)置信息。
<layout type="log4net.Layout.PatternLayout"> <!--頭--> <Header value="[Header]"/> <!--腳注--> <Footer value="[Footer]"/> <!--正文--> <ConversionPattern value="%d [%t] %-5p %c [%x] - %m%n" /> </layout>
這里配置的信息最終是日志打印出來(lái)的樣式。我們可以看到這里可以設(shè)置內(nèi)容頭Header和尾Footer。正文ConversionPattern。在正文中有出現(xiàn)有 %d [%t]這些都是啥意思了表示什么。這里有一個(gè)對(duì)照表可提供參考:
%m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息
%n(new line):換行
%d(datetime):輸出當(dāng)前語(yǔ)句運(yùn)行的時(shí)刻
%r(run time):輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語(yǔ)句時(shí)消耗的毫秒數(shù)
%t(thread id):當(dāng)前語(yǔ)句所在的線程ID
%p(priority): 日志的當(dāng)前優(yōu)先級(jí)別,即DEBUG、INFO、WARN…等
%c(class):當(dāng)前日志對(duì)象的名稱,例如:
%L:輸出語(yǔ)句所在的行號(hào)
%F:輸出語(yǔ)句所在的文件名
%-數(shù)字:表示該項(xiàng)的最小長(zhǎng)度,如果不夠,則用空格填充
配置的基本也就這些。下就是root的配置說(shuō)明 。
root:
對(duì)設(shè)置輸出的方式進(jìn)行指定。
<root> <!--批定DEBUG輸出的文件形式記錄日志--> <level value="DEBUG"/> <appender-ref ref="Log4Net_ERROR" /> <!--批定INFO輸出的文件形式記錄日志--> <level value="INFO"/> <appender-ref ref="Log4Net_INFO" /> </root>
控制級(jí)別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定義級(jí)別為INFO,則INFO級(jí)別向下的級(jí)別,比如DEBUG日志將不會(huì)被記錄
如果沒(méi)有定義LEVEL的值,則缺省為DEBUG
附帶源碼:代碼
相關(guān)文章
C#使用System.Threading.Timer實(shí)現(xiàn)計(jì)時(shí)器的示例詳解
以往一般都是用 System.Timers.Timer 來(lái)做計(jì)時(shí)器,其實(shí) System.Threading.Timer 也可以實(shí)現(xiàn)計(jì)時(shí)器功能,下面就跟隨小編一起來(lái)學(xué)習(xí)一下如何使用System.Threading.Timer實(shí)現(xiàn)計(jì)時(shí)器功能吧2024-01-01C# List中FindAll用法的一些簡(jiǎn)單示例
本篇文章只要是對(duì)C# List中FindAll用法的一些簡(jiǎn)單示例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01C#日期時(shí)間類的使用方法(DateTime類、TimeSpan類與DateTimeOffset類)
在C#中我們常使用到關(guān)于時(shí)間的相關(guān)操作,這篇文章主要給大家介紹了關(guān)于C#日期時(shí)間類的使用方法,文中介紹的方法分別包括DateTime類、TimeSpan類與DateTimeOffset類的相關(guān)資料,需要的朋友可以參考下2023-11-11