欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Log4Net配置詳解及輸出自定義消息類示例代碼

 更新時(shí)間:2024年07月05日 09:49:11   作者:letmebaby  
這篇文章主要介紹了Log4Net配置詳解及輸出自定義消息類示例代碼,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

1.簡(jiǎn)單使用實(shí)例

1.1 添加log4net.dll的引用。

  在NuGet程序包中搜索log4net并添加,此次我所用版本為2.0.17。如下圖:

1.2 添加配置文件

  右鍵項(xiàng)目,添加新建項(xiàng),搜索選擇應(yīng)用程序配置文件,命名為log4net.config,步驟如下圖:

1.2.1 log4net.config簡(jiǎn)單配置示例

  下面是一個(gè)簡(jiǎn)單的配置示例,詳細(xì)節(jié)點(diǎn)及相應(yīng)的說(shuō)明詳見(jiàn) 2. 配置文件節(jié)點(diǎn)詳解

log4net.config配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
	<logger name="DefaultLog">
		<!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
		<!--如果沒(méi)有定義LEVEL的值,則缺省為DEBUG-->
		<level value="ALL" />
		<appender-ref ref="FileAppenderDefault"></appender-ref>
	</logger>
	<!-- appender 定義日志輸出方式   將日志以回滾文件的形式寫(xiě)到文件中。-->
	<appender name="FileAppenderDefault" type="log4net.Appender.RollingFileAppender">
		<!--絕對(duì)路徑-->
		<!--<file value="D:\KangarooLog.txt"></file>-->
		<!--日志輸出到exe程序這個(gè)相對(duì)目錄下-->
		<file value="../../Log/DefalutLog" />
		<!--相對(duì)路徑,在項(xiàng)目的根目錄下-->
		<!--以最后一個(gè)路徑為準(zhǔn),所以上面的絕對(duì)路徑下不會(huì)寫(xiě)日志-->
		<!--<file value="./Log/Kangaroo.txt"></file>-->
		<!--防止多線程時(shí)不能寫(xiě)Log,官方說(shuō)線程非安全-->
		<!--實(shí)際使用時(shí),本地測(cè)試正常,部署后沒(méi)有不能寫(xiě)日志的情況-->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<!--追加日志內(nèi)容,true后續(xù)輸出的日志會(huì)追加到之前的日志文件-->
		<appendToFile value="true" />
		<!--可以為:Once|Size|Date|Composite-->
		<!--Composite為Size和Date的組合-->
		<rollingStyle value="Composite" />
		<!--日志最大個(gè)數(shù),都是最新的-->
		<!--rollingStyle節(jié)點(diǎn)為Date時(shí),該節(jié)點(diǎn)不起作用-->
		<!--rollingStyle節(jié)點(diǎn)為Size時(shí),只能有value個(gè)日志-->
		<!--rollingStyle節(jié)點(diǎn)為Composite時(shí),每天有value個(gè)日志-->
		<maxSizeRollBackups value="10" />
		<!--當(dāng)備份文件時(shí),為文件名加的后綴-->
		<!--后綴為*.txt時(shí),例:AX.txt_2008-07-24.PxP  應(yīng)該是程序上的一個(gè)bug-->
		<!--后綴為*.TXT時(shí),例:AX.txt_2008-07-25.TXT-->
		<datePattern value="_yyyy-MM-dd'.log'" />
		<!--每個(gè)文件的大小。只在混合方式與文件大小方式下使用。超出大小后在所有文件名后自動(dòng)增加正整數(shù)重新命名,數(shù)字最大的最早寫(xiě)入。可用的單位:KB|MB|GB。不要使用小數(shù),否則會(huì)一直寫(xiě)入當(dāng)前日志-->
		<maximumFileSize value="10MB" />
		<!--置為true,當(dāng)前最新日志文件名永遠(yuǎn)為file節(jié)中的名字-->
		<staticLogFileName value="false" />
		<!--輸出級(jí)別在INFO和ERROR之間的日志-->
		<!--<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="INFO" />
			<param name="LevelMax" value="ERROR" />
		</filter>-->
		<!--必須結(jié)合起來(lái)用,第一個(gè)只過(guò)濾出WARN,第二個(gè)拒絕其它其它日志輸出-->
		<filter type="log4net.Filter.LevelMatchFilter">
			<param name="LevelToMatch" value="WARN" />
		</filter>
		<filter type="log4net.Filter.DenyAllFilter" />
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%n==========
			%n【日志級(jí)別】%-5level
			%n【記錄時(shí)間】%date
			%n【執(zhí)行時(shí)間】[%r]毫秒
			%n【執(zhí)行Log分類的名稱】%logger
			%n【傳入信息內(nèi)容】%message
			%n=========="/>
		</layout>
	</appender>
</log4net>
</configuration>
<!--==================================layout節(jié)點(diǎn)的配置說(shuō)明==================================-->
<!--                                                                        Made By YSL      -->
<!--        %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ì)象的名稱,例如:                                                -->
<!--               模式字符串為:%-10c -%m%n                                                    -->
<!--               代碼為:                                                                     -->
<!--        ILog log=LogManager.GetLogger(“Exam.Log”);                                        -->
<!--        log.Debug(“Hello”);                                                               -->
<!--            則輸出為下面的形式:                                                            -->
<!--        Exam.Log       - Hello                                                              -->
<!--        %L:輸出語(yǔ)句所在的行號(hào)                                                              -->
<!--        %F:輸出語(yǔ)句所在的文件名                                                            -->
<!--        %-數(shù)字:表示該項(xiàng)的最小長(zhǎng)度,如果不夠,則用空格填充                                  -->

1.2.2 設(shè)置log4net.config配置文件屬性

  點(diǎn)擊log4net.config,將其文件屬性設(shè)為始終復(fù)制,如下圖:

image

1.3 在項(xiàng)目中引入該配置文件

  這里有兩種方式引入配置文件。

1.3.1 在項(xiàng)目的 AssemblyInfo.cs 中引入配置文件

  首先在項(xiàng)目中新建一個(gè)Config文件夾,將之前創(chuàng)建的log4net.config文件放入其中,隨后在 AssemblyInfo.cs 中添加如下語(yǔ)句:

image

1.3.2 在項(xiàng)目運(yùn)行時(shí)動(dòng)態(tài)引入配置文件

  使用固定語(yǔ)句引入配置文件,如下所示,其中,configFilePath 為配置文件的絕對(duì)路徑。

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(configFilePath));

1.4 創(chuàng)建幫助類使用日志進(jìn)行記錄

  我們首先創(chuàng)建名為 Log4Helper 的類,并使用固定的log4net.LogManager.GetLogger()語(yǔ)句實(shí)例化對(duì)應(yīng)的Log對(duì)象,然后調(diào)用其對(duì)應(yīng)的方法即可寫(xiě)入日志。示例代碼如下:

Log4Helper代碼

 public class Log4Helper
 {
     private static readonly log4net.ILog logDefault = log4net.LogManager.GetLogger("DefaultLog");
     /// <summary>
     /// 測(cè)試默認(rèn)配置信息輸出(輸出范圍做了限制)
     /// </summary>
     public static void TestDefaultLog()
     {
         logDefault.Debug("這是條調(diào)試信息");
         logDefault.Info("這是條提示信息");
         logDefault.Warn("這是條警告信息");
         logDefault.Error("這是條錯(cuò)誤信息");
         logDefault.Fatal("這是條致命錯(cuò)誤信息");
     }
     /// <summary>
     /// Log4Net初始化(可讀取自定義配置)
     /// </summary>
     /// <param name="configFilePath"></param>
     public static void Log4NetInit(string configFilePath)
     {
         log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(configFilePath));
     }
     /// <summary>
     /// 返回指定名稱的日志對(duì)象
     /// </summary>
     public static log4net.ILog Log(string appenderName)
     {
         return log4net.LogManager.GetLogger(appenderName);
     }
 }

1.5 在主程序中引用

  最后一步就是在主程序中引用 Log4Helper 中的日志記錄方法,如下所示:

private void Application_Startup(object sender, StartupEventArgs e)
 {
     Log4Helper.TestDefaultLog();
 }

  根據(jù)上面 log4net.config 配置中 file 節(jié)點(diǎn)中的地址,在項(xiàng)目中會(huì)生成 Log 文件夾,該文件夾下會(huì)生成類似 DefalutLog_2024-07-01.log 的文件。該文件名由 file 節(jié)點(diǎn)和 datePattern 節(jié)點(diǎn)兩部分組合而成,其中,staticLogFileName節(jié)點(diǎn)需要被設(shè)置為 false ,若為 true ,則當(dāng)前最新日志文件名永遠(yuǎn)為 file 節(jié)點(diǎn)中的名字,其余日志會(huì)根據(jù) datePattern 節(jié)點(diǎn)自動(dòng)添加后綴。

  打開(kāi)日志文件,會(huì)發(fā)現(xiàn)里面只有 WARN 警告信息,例如:

==========                     
【日志級(jí)別】WARN                      
【記錄時(shí)間】2024-07-01 00:18:28,828                     
【執(zhí)行時(shí)間】[53]毫秒                     
【執(zhí)行Log分類的名稱】DefaultLog              
【傳入信息內(nèi)容】這是條警告信息             
==========

  這是因?yàn)榕渲弥械?filter 過(guò)濾節(jié)點(diǎn),詳見(jiàn)注釋,將其注釋再次運(yùn)行,則會(huì)正常顯示全部日志信息。

2. 配置文件節(jié)點(diǎn)詳解

  log4net的主要組成有四部分,分別是 Logger、Appender、Layout、Filter等,詳見(jiàn)下方。

2.1 Logger 節(jié)點(diǎn)配置詳解

  以上文的配置為例解釋:

<logger name="DefaultLog">
	<!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
	<!--如果沒(méi)有定義LEVEL的值,則缺省為DEBUG-->
	<level value="ALL" />
	<appender-ref ref="FileAppenderDefault"></appender-ref>
</logger>

  level 定義記錄的日志級(jí)別,就是說(shuō),你要記錄哪個(gè)級(jí)別以上的日志,級(jí)別由低到高依次是:

ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF

  如果你 level 定義 INFO,那么低于 INFO 級(jí)別以下的信息,將不會(huì)記入日志,啥意思呢?
  就是說(shuō),就算你在程序里,用 log.Debug() 來(lái)寫(xiě)入一個(gè)日志信息,可是你在配置中指定 level 為 INFO,由于 DEBUG 級(jí)別低于 INFO,所以,不會(huì)被記入日志。這樣的處理非常靈活。

  在具體寫(xiě)日志時(shí),一般可以這樣理解日志等級(jí):

FATAL(致命錯(cuò)誤):記錄系統(tǒng)中出現(xiàn)的能使用系統(tǒng)完全失去功能,服務(wù)停止,系統(tǒng)崩潰等使系統(tǒng)無(wú)法繼續(xù)運(yùn)行下去的錯(cuò)誤。例如,數(shù)據(jù)庫(kù)無(wú)法連接,系統(tǒng)出現(xiàn)死循環(huán)。

ERROR(一般錯(cuò)誤):記錄系統(tǒng)中出現(xiàn)的導(dǎo)致系統(tǒng)不穩(wěn)定,部分功能出現(xiàn)混亂或部分功能失效一類的錯(cuò)誤。例如,數(shù)據(jù)字段為空,數(shù)據(jù)操作不可完成,操作出現(xiàn)異常等。

WARN(警告):記錄系統(tǒng)中不影響系統(tǒng)繼續(xù)運(yùn)行,但不符合系統(tǒng)運(yùn)行正常條件,有可能引起系統(tǒng)錯(cuò)誤的信息。例如,記錄內(nèi)容為空,數(shù)據(jù)內(nèi)容不正確等。

INFO(一般信息):記錄系統(tǒng)運(yùn)行中應(yīng)該讓用戶知道的基本信息。例如,服務(wù)開(kāi)始運(yùn)行,功能已經(jīng)開(kāi)戶等。

DEBUG (調(diào)試信息):記錄系統(tǒng)用于調(diào)試的一切信息,內(nèi)容或者是一些關(guān)鍵數(shù)據(jù)內(nèi)容的輸出。

  appender-ref,要引用的 appender 的名字,由 Layout 控制輸出格式。

  最后還要說(shuō)一個(gè)LogManager類,它用來(lái)管理所有的Logger。它的GetLogger靜態(tài)方法,可以獲得配置文件中相應(yīng)的Logger:

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");

2.2 Appender 節(jié)點(diǎn)配置詳解

  以上文的 FileAppenderDefault 節(jié)點(diǎn)為例:

 FileAppenderDefault 節(jié)點(diǎn)配置

<!-- appender 定義日志輸出方式   將日志以回滾文件的形式寫(xiě)到文件中。-->
	<appender name="FileAppenderDefault" type="log4net.Appender.RollingFileAppender">
		<!--絕對(duì)路徑-->
		<!--<file value="D:\KangarooLog.txt"></file>-->
		<!--日志輸出到exe程序這個(gè)相對(duì)目錄下-->
		<file value="../../Log/DefalutLog" />
		<!--相對(duì)路徑,在項(xiàng)目的根目錄下-->
		<!--以最后一個(gè)路徑為準(zhǔn),所以上面的絕對(duì)路徑下不會(huì)寫(xiě)日志-->
		<!--<file value="./Log/Kangaroo.txt"></file>-->
		<!--防止多線程時(shí)不能寫(xiě)Log,官方說(shuō)線程非安全-->
		<!--實(shí)際使用時(shí),本地測(cè)試正常,部署后沒(méi)有不能寫(xiě)日志的情況-->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<!--追加日志內(nèi)容,true后續(xù)輸出的日志會(huì)追加到之前的日志文件-->
		<appendToFile value="true" />
		<!--可以為:Once|Size|Date|Composite-->
		<!--Composite為Size和Date的組合-->
		<rollingStyle value="Composite" />
		<!--日志最大個(gè)數(shù),都是最新的-->
		<!--rollingStyle節(jié)點(diǎn)為Date時(shí),該節(jié)點(diǎn)不起作用-->
		<!--rollingStyle節(jié)點(diǎn)為Size時(shí),只能有value個(gè)日志-->
		<!--rollingStyle節(jié)點(diǎn)為Composite時(shí),每天有value個(gè)日志-->
		<maxSizeRollBackups value="10" />
		<!--當(dāng)備份文件時(shí),為文件名加的后綴-->
		<!--后綴為*.txt時(shí),例:AX.txt_2008-07-24.PxP  應(yīng)該是程序上的一個(gè)bug-->
		<!--后綴為*.TXT時(shí),例:AX.txt_2008-07-25.TXT-->
		<datePattern value="_yyyy-MM-dd'.log'" />
		<!--每個(gè)文件的大小。只在混合方式與文件大小方式下使用。超出大小后在所有文件名后自動(dòng)增加正整數(shù)重新命名,數(shù)字最大的最早寫(xiě)入。可用的單位:KB|MB|GB。不要使用小數(shù),否則會(huì)一直寫(xiě)入當(dāng)前日志-->
		<maximumFileSize value="10MB" />
		<!--置為true,當(dāng)前最新日志文件名永遠(yuǎn)為file節(jié)中的名字-->
		<staticLogFileName value="false" />
		<!--輸出級(jí)別在INFO和ERROR之間的日志-->
		<!--<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="INFO" />
			<param name="LevelMax" value="ERROR" />
		</filter>-->
		<!--必須結(jié)合起來(lái)用,第一個(gè)只過(guò)濾出WARN,第二個(gè)拒絕其它其它日志輸出-->
		<filter type="log4net.Filter.LevelMatchFilter">
			<param name="LevelToMatch" value="WARN" />
		</filter>
		<filter type="log4net.Filter.DenyAllFilter" />
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%n==========
			%n【日志級(jí)別】%-5level
			%n【記錄時(shí)間】%date
			%n【執(zhí)行時(shí)間】[%r]毫秒
			%n【執(zhí)行Log分類的名稱】%logger
			%n【傳入信息內(nèi)容】%message
			%n=========="/>
		</layout>
	</appender>

  每個(gè)節(jié)點(diǎn)均寫(xiě)有注釋,這里額外介紹下 appender 的輸出方式( type 屬性),如下所示:

 appender 輸出方式

AdoNetAppender              將日志記錄到數(shù)據(jù)庫(kù)中??梢圆捎肧QL和存儲(chǔ)過(guò)程兩種方式。
	AnsiColorTerminalAppender   將日志高亮輸出到ANSI終端。
	AspNetTraceAppender         能用asp.net中Trace的方式查看記錄的日志。
	BufferingForwardingAppender 在輸出到子Appenders之前先緩存日志事件。
	ConsoleAppender             將日志輸出到應(yīng)用程序控制臺(tái)。
	EventLogAppender            將日志寫(xiě)到Windows Event Log。
	FileAppender                將日志輸出到文件。
	ForwardingAppender          發(fā)送日志事件到子Appenders。
	LocalSyslogAppender         將日志寫(xiě)到local syslog service (僅用于UNIX環(huán)境下)。
	MemoryAppender              將日志存到內(nèi)存緩沖區(qū)。
	NetSendAppender             將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對(duì)話框中顯示。
	OutputDebugStringAppender   將日志輸出到Debuger,如果程序沒(méi)有Debuger,就輸出到系統(tǒng)Debuger。如果系統(tǒng)Debuger也不可用,將忽略消息。
	RemoteSyslogAppender        通過(guò)UDP網(wǎng)絡(luò)協(xié)議將日志寫(xiě)到Remote syslog service。
	RemotingAppender            通過(guò).NET Remoting將日志寫(xiě)到遠(yuǎn)程接收端。
	RollingFileAppender         將日志以回滾文件的形式寫(xiě)到文件中。
	SmtpAppender                將日志寫(xiě)到郵件中。
	SmtpPickupDirAppender       將消息以文件的方式放入一個(gè)目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發(fā)送它們。
	TelnetAppender              客戶端通過(guò)Telnet來(lái)接受日志事件。
	TraceAppender               將日志寫(xiě)到.NET trace 系統(tǒng)。
	UdpAppender                 將日志以無(wú)連接UDP數(shù)據(jù)報(bào)的形式送到遠(yuǎn)程宿主或用UdpClient的形式廣播。

2.3 Filter 節(jié)點(diǎn)配置詳解

  filter只能作為 appender 的子元素,type 屬性表示 Filter 的類型。常用子元素 param 數(shù)量0個(gè)或多個(gè),作用設(shè)置一些參數(shù)。具體例子詳見(jiàn)上文 2.2 Appender 節(jié)點(diǎn)配置詳解 。

  額外補(bǔ)充下 filter 的類型說(shuō)明:

DenyAllFilter       阻止所有的日志事件被記錄
	LevelMatchFilter    只有指定等級(jí)的日志事件才被記錄
	LevelRangeFilter    日志等級(jí)在指定范圍內(nèi)的事件才被記錄
	LoggerMatchFilter   Logger名稱匹配,才記錄
	PropertyFilter      消息匹配指定的屬性值時(shí)才被記錄
	StringMathFilter    消息匹配指定的字符串才被記錄

2.4 Layout 節(jié)點(diǎn)配置詳解

  layout 節(jié)點(diǎn)只能作為 appender 的子元素。type 屬性表示 Layout 的類型。具體例子詳見(jiàn)上文 2.2 Appender 節(jié)點(diǎn)配置詳解 。

  額外補(bǔ)充 layout 節(jié)點(diǎn)的 type 屬性取值:

ExceptionLayout         只呈現(xiàn)日志事件中異常的文本信息
	PatternLayout           可以通過(guò)類型字符串來(lái)配置的布局
	RawPropertyLayout       從日志事件中提取屬性值
	RawTimeStampLayout      從日志事件中提取日期
	RawUtcTimeStampLayout   從日志事件中提取UTC日期
	SimpleLayout            很簡(jiǎn)單的布局
	XmlLayout               把日志事件格式化為XML元素的布局

  這其中我們主要使用的還是PatternLayout 類型,而在 ConversionPattern 節(jié)點(diǎn)中,我們可以進(jìn)一步的配置日志輸出格式,以 PatterLayout 的格式化字符串輸出為例:

 PatterLayout 的格式化字符串

    %m、%message         輸出的日志消息
    %d、%datetime        輸出當(dāng)前語(yǔ)句運(yùn)行的時(shí)刻,格式%date{yyyy-MM-dd HH:mm:ss,fff}
    %r、%timestamp       輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語(yǔ)句時(shí)消耗的毫秒數(shù)
    %p、%level           日志的當(dāng)前優(yōu)先級(jí)別
    %c、%logger          當(dāng)前日志對(duì)象的名稱
    %L、%line            輸出語(yǔ)句所在的行號(hào)
    %F、%file            輸出語(yǔ)句所在的文件名,警告:只在調(diào)試的時(shí)候有效,調(diào)用本地信息會(huì)影響性能
    %a、%appdomain       引發(fā)日志事件的應(yīng)用程序域的名稱。
    %C、%class、%type    引發(fā)日志請(qǐng)求的類的全名,警告:會(huì)影響性能
    %exception           異常信息
    %u、%identity        當(dāng)前活動(dòng)用戶的名字,我測(cè)試的時(shí)候%identity返回都是空的。警告:會(huì)影響性能
    %l、%location        引發(fā)日志事件的名空間、類名、方法、行號(hào)。警告:會(huì)影響性能,依賴pdb文件
    %M、%method          發(fā)生日志請(qǐng)求的方法名,警告:會(huì)影響性能
    %n、%newline         換行符
    %x、%ndc             NDC(nested diagnostic context)
    %X、%mdc、%P、%properties  等介于 %property
    %property           輸出{log4net:Identity=, log4net:UserName=, log4net:HostName=} 
    %t、%thread         引發(fā)日志事件的線程,如果沒(méi)有線程名就使用線程號(hào)。
    %w、%username       當(dāng)前用戶的WindowsIdentity,類似:HostName/Username。警告:會(huì)影響性能
    %utcdate            發(fā)生日志事件的UTC時(shí)間。例如:%utcdate{HH:mm:ss,fff}
    %%                  輸出一個(gè)百分號(hào)

  額外補(bǔ)充下 PatterLayout 格式修飾符:

格式修飾符對(duì)齊最小寬最大寬說(shuō)明
%20logger右對(duì)齊20無(wú)如果logger名不足20個(gè)字符,就在左邊補(bǔ)空格
%-20logger左對(duì)齊20無(wú)如果logger名不足20個(gè)字符,就在右邊補(bǔ)空格
%.30logger左對(duì)齊無(wú)30超過(guò)30個(gè)字符將截?cái)?/td>
%20.30logger右對(duì)齊2030logger名要在20到30之間,少了在左邊補(bǔ)空格,多了截?cái)?/td>
%-20.30logger左對(duì)齊2030logger名要在20到30之間,少了在右邊補(bǔ)空格,多了截?cái)?/td>

3. 如何輸出自定義類

  自定義擴(kuò)展輸出,通過(guò)繼承 log4net.Layout.PatternLayout 和 log4net.Layout.Pattern.PatternLayoutConverter 類,使用 log4net.Core.LoggingEvent 類的方法得到了要輸出的 LogEntity 類的名稱。

  然后通過(guò)反射得到各個(gè)屬性的值,使用 PatternLayout 類 AddConverter 方法傳入得到的值,在 PatternLayoutConverter 中對(duì)其進(jìn)行處理。注意配置文件 Appender 中的 Layout type 用到的類的命名空間以及類名,要同步更改為自定義類的。詳見(jiàn)示例:

自定義拓展類的代碼

namespace WPFPractice
{
    public class CustomLayout : log4net.Layout.PatternLayout
    {
        public CustomLayout()
        {
            this.AddConverter("Custom", typeof(CustomConvert));
        }
    }
    public class CustomConvert : log4net.Layout.Pattern.PatternLayoutConverter
    {
        protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
        {
            if (!string.IsNullOrEmpty(Option))
            {
                object obj = loggingEvent.MessageObject;
                if (obj != null)
                {
                    PropertyInfo info = obj.GetType().GetProperty(Option);
                    if (info != null)
                    {
                        object cusMsg = info.GetValue(obj, null);
                        writer.Write(cusMsg);
                    }
                }
            }
        }
    }
}

  與之對(duì)應(yīng)的,我們的配置文件也添加以下代碼:

配置文件新增代碼

<logger name="CustomLog">
		<!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
		<!--如果沒(méi)有定義LEVEL的值,則缺省為DEBUG-->
		<level value="ALL" />
		<appender-ref ref="FileAppenderCustom"></appender-ref>
	</logger>
	<appender name="FileAppenderCustom" type="log4net.Appender.RollingFileAppender">
		<file value="../../Log/CustomLog" />
		<appendToFile value="true" />
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<rollingStyle value="Composite" />
		<maxSizeRollBackups value="5" />
		<datePattern value="_yyyy-MM-dd'.log'" />
		<maximumFileSize value="10MB" />
		<staticLogFileName value="false" />
		<layout type="WPFPractice.CustomLayout">
			<conversionPattern value="%n==========
			%n【日志級(jí)別】%-5level
			%n【記錄時(shí)間】%date
			%n【執(zhí)行時(shí)間】[%r]毫秒
			%n【執(zhí)行線程ID】[%thread]
			%n【執(zhí)行Log分類的名稱】%logger
			%n【耗材類型名】%Custom{LabTypeName}
			%n【耗材名】%Custom{LabName}
			%n【耗材編號(hào)】%Custom{LabNumber}
			%n【是否吸頭】%Custom{IsTip}
			%n【傳入信息內(nèi)容/類型】%message
			%n==========" />
		</layout>
	</appender>

  接下來(lái)我們新建一個(gè)類 LabwareModel,并在幫助類 Log4Helper 中添加調(diào)用 CustomLog 的方法,來(lái)測(cè)試能否輸出自定義類 LabwareModel 中的內(nèi)容。

自定義類 LabwareModel

public class LabwareModel
{
    public string LabTypeName { get; set; } = "采樣管";
    public string LabName { get; set; } = "Custom_2000ul";
    public double LabNumber { get; set; } = 200;
    public int IsTip { get; set; } = 1;
}

  幫助類 Log4Helper 如下:

查看幫助類 Log4Helper

 private static readonly log4net.ILog logDefault = log4net.LogManager.GetLogger("DefaultLog");
 /// <summary>
 /// 生成默認(rèn)實(shí)例
 /// </summary>
 /// <returns></returns>
 public static LabwareModel GetLabwareModel() 
 {
     LabwareModel labwareModel = new LabwareModel();
     return labwareModel;
 }
 /// <summary>
 /// 測(cè)試自定義配置信息輸出
 /// </summary>
 public static void TestCustomLog()
 {
     var labware = GetLabwareModel();
     logCustom.Debug("這是條調(diào)試信息");
     logCustom.Info("這是條提示信息");
     logCustom.Warn("這是條警告信息");
     logCustom.Error(labware);
     logCustom.Fatal("這是條致命錯(cuò)誤信息");
 }

  在主程序中調(diào)用進(jìn)行測(cè)試:

private void Application_Startup(object sender, StartupEventArgs e)
{
    Log4Helper.TestCustomLog();
    Log4Helper.TestDefaultLog();
}

  根據(jù)上面 FileAppenderCustom 配置中 file 節(jié)點(diǎn)中的地址,在項(xiàng)目中會(huì)生成 Log 文件夾,該文件夾下會(huì)生成類似 CustomLog_2024-07-01.log 的文件。打開(kāi)文件會(huì)看到輸出內(nèi)容如下:

日志輸出內(nèi)容

==========           
【日志級(jí)別】DEBUG                  
【記錄時(shí)間】2024-07-01 00:18:28,812                  
【執(zhí)行時(shí)間】[37]毫秒           
【執(zhí)行線程ID】[1]           
【執(zhí)行Log分類的名稱】CustomLog           
【耗材類型名】           
【耗材名】           
【耗材編號(hào)】           
【是否吸頭】           
【傳入信息內(nèi)容/類型】這是條調(diào)試信息           
==========
==========           
【日志級(jí)別】INFO                   
【記錄時(shí)間】2024-07-01 00:18:28,823                  
【執(zhí)行時(shí)間】[48]毫秒           
【執(zhí)行線程ID】[1]           
【執(zhí)行Log分類的名稱】CustomLog           
【耗材類型名】           
【耗材名】           
【耗材編號(hào)】           
【是否吸頭】           
【傳入信息內(nèi)容/類型】這是條提示信息           
==========
==========           
【日志級(jí)別】WARN                   
【記錄時(shí)間】2024-07-01 00:18:28,825                  
【執(zhí)行時(shí)間】[50]毫秒           
【執(zhí)行線程ID】[1]           
【執(zhí)行Log分類的名稱】CustomLog           
【耗材類型名】           
【耗材名】           
【耗材編號(hào)】           
【是否吸頭】           
【傳入信息內(nèi)容/類型】這是條警告信息           
==========
==========           
【日志級(jí)別】ERROR                  
【記錄時(shí)間】2024-07-01 00:18:28,826                  
【執(zhí)行時(shí)間】[51]毫秒           
【執(zhí)行線程ID】[1]           
【執(zhí)行Log分類的名稱】CustomLog           
【耗材類型名】采樣管           
【耗材名】Custom_2000ul           
【耗材編號(hào)】200           
【是否吸頭】1           
【傳入信息內(nèi)容/類型】WPFPractice.LabwareModel           
==========
==========           
【日志級(jí)別】FATAL                  
【記錄時(shí)間】2024-07-01 00:18:28,828                  
【執(zhí)行時(shí)間】[53]毫秒           
【執(zhí)行線程ID】[1]           
【執(zhí)行Log分類的名稱】CustomLog           
【耗材類型名】           
【耗材名】           
【耗材編號(hào)】           
【是否吸頭】           
【傳入信息內(nèi)容/類型】這是條致命錯(cuò)誤信息           
==========

  以上就是關(guān)于 Log4Net 配置詳解。

到此這篇關(guān)于Log4Net配置詳解及輸出自定義消息類示例 的文章就介紹到這了,更多相關(guān)Log4Net配置輸出自定義消息類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論