Log4Net配置詳解及輸出自定義消息類示例代碼
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)的說明詳見 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--> <!--如果沒有定義LEVEL的值,則缺省為DEBUG--> <level value="ALL" /> <appender-ref ref="FileAppenderDefault"></appender-ref> </logger> <!-- appender 定義日志輸出方式 將日志以回滾文件的形式寫到文件中。--> <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ì)寫日志--> <!--<file value="./Log/Kangaroo.txt"></file>--> <!--防止多線程時(shí)不能寫Log,官方說線程非安全--> <!--實(shí)際使用時(shí),本地測(cè)試正常,部署后沒有不能寫日志的情況--> <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ù)字最大的最早寫入??捎玫膯挝?KB|MB|GB。不要使用小數(shù),否則會(huì)一直寫入當(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é)合起來用,第一個(gè)只過濾出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)的配置說明==================================--> <!-- Made By YSL --> <!-- %m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息 --> <!-- %n(new line):換行 --> <!-- %d(datetime):輸出當(dāng)前語句運(yùn)行的時(shí)刻 --> <!-- %r(run time):輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語句時(shí)消耗的毫秒數(shù) --> <!-- %t(thread id):當(dāng)前語句所在的線程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:輸出語句所在的行號(hào) --> <!-- %F:輸出語句所在的文件名 --> <!-- %-數(shù)字:表示該項(xiàng)的最小長(zhǎng)度,如果不夠,則用空格填充 -->
1.2.2 設(shè)置log4net.config配置文件屬性
點(diǎn)擊log4net.config,將其文件屬性設(shè)為始終復(fù)制,如下圖:
1.3 在項(xiàng)目中引入該配置文件
這里有兩種方式引入配置文件。
1.3.1 在項(xiàng)目的 AssemblyInfo.cs 中引入配置文件
首先在項(xiàng)目中新建一個(gè)Config文件夾,將之前創(chuàng)建的log4net.config文件放入其中,隨后在 AssemblyInfo.cs 中添加如下語句:
1.3.2 在項(xiàng)目運(yùn)行時(shí)動(dòng)態(tài)引入配置文件
使用固定語句引入配置文件,如下所示,其中,configFilePath 為配置文件的絕對(duì)路徑。
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(configFilePath));
1.4 創(chuàng)建幫助類使用日志進(jìn)行記錄
我們首先創(chuàng)建名為 Log4Helper 的類,并使用固定的log4net.LogManager.GetLogger()
語句實(shí)例化對(duì)應(yīng)的Log對(duì)象,然后調(diào)用其對(duì)應(yīng)的方法即可寫入日志。示例代碼如下:
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)添加后綴。
打開日志文件,會(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 過濾節(jié)點(diǎn),詳見注釋,將其注釋再次運(yùn)行,則會(huì)正常顯示全部日志信息。
2. 配置文件節(jié)點(diǎn)詳解
log4net的主要組成有四部分,分別是 Logger、Appender、Layout、Filter等,詳見下方。
2.1 Logger 節(jié)點(diǎn)配置詳解
以上文的配置為例解釋:
<logger name="DefaultLog"> <!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--如果沒有定義LEVEL的值,則缺省為DEBUG--> <level value="ALL" /> <appender-ref ref="FileAppenderDefault"></appender-ref> </logger>
level 定義記錄的日志級(jí)別,就是說,你要記錄哪個(gè)級(jí)別以上的日志,級(jí)別由低到高依次是:
ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
如果你 level 定義 INFO,那么低于 INFO 級(jí)別以下的信息,將不會(huì)記入日志,啥意思呢?
就是說,就算你在程序里,用 log.Debug() 來寫入一個(gè)日志信息,可是你在配置中指定 level 為 INFO,由于 DEBUG 級(jí)別低于 INFO,所以,不會(huì)被記入日志。這樣的處理非常靈活。
在具體寫日志時(shí),一般可以這樣理解日志等級(jí):
FATAL(致命錯(cuò)誤):記錄系統(tǒng)中出現(xiàn)的能使用系統(tǒng)完全失去功能,服務(wù)停止,系統(tǒng)崩潰等使系統(tǒng)無法繼續(xù)運(yùn)行下去的錯(cuò)誤。例如,數(shù)據(jù)庫無法連接,系統(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ù)開始運(yùn)行,功能已經(jīng)開戶等。
DEBUG (調(diào)試信息):記錄系統(tǒng)用于調(diào)試的一切信息,內(nèi)容或者是一些關(guān)鍵數(shù)據(jù)內(nèi)容的輸出。
appender-ref,要引用的 appender 的名字,由 Layout 控制輸出格式。
最后還要說一個(gè)LogManager類,它用來管理所有的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 定義日志輸出方式 將日志以回滾文件的形式寫到文件中。--> <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ì)寫日志--> <!--<file value="./Log/Kangaroo.txt"></file>--> <!--防止多線程時(shí)不能寫Log,官方說線程非安全--> <!--實(shí)際使用時(shí),本地測(cè)試正常,部署后沒有不能寫日志的情況--> <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ù)字最大的最早寫入??捎玫膯挝?KB|MB|GB。不要使用小數(shù),否則會(huì)一直寫入當(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é)合起來用,第一個(gè)只過濾出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)均寫有注釋,這里額外介紹下 appender 的輸出方式( type 屬性),如下所示:
appender 輸出方式
AdoNetAppender 將日志記錄到數(shù)據(jù)庫中??梢圆捎肧QL和存儲(chǔ)過程兩種方式。 AnsiColorTerminalAppender 將日志高亮輸出到ANSI終端。 AspNetTraceAppender 能用asp.net中Trace的方式查看記錄的日志。 BufferingForwardingAppender 在輸出到子Appenders之前先緩存日志事件。 ConsoleAppender 將日志輸出到應(yīng)用程序控制臺(tái)。 EventLogAppender 將日志寫到Windows Event Log。 FileAppender 將日志輸出到文件。 ForwardingAppender 發(fā)送日志事件到子Appenders。 LocalSyslogAppender 將日志寫到local syslog service (僅用于UNIX環(huán)境下)。 MemoryAppender 將日志存到內(nèi)存緩沖區(qū)。 NetSendAppender 將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對(duì)話框中顯示。 OutputDebugStringAppender 將日志輸出到Debuger,如果程序沒有Debuger,就輸出到系統(tǒng)Debuger。如果系統(tǒng)Debuger也不可用,將忽略消息。 RemoteSyslogAppender 通過UDP網(wǎng)絡(luò)協(xié)議將日志寫到Remote syslog service。 RemotingAppender 通過.NET Remoting將日志寫到遠(yuǎn)程接收端。 RollingFileAppender 將日志以回滾文件的形式寫到文件中。 SmtpAppender 將日志寫到郵件中。 SmtpPickupDirAppender 將消息以文件的方式放入一個(gè)目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發(fā)送它們。 TelnetAppender 客戶端通過Telnet來接受日志事件。 TraceAppender 將日志寫到.NET trace 系統(tǒng)。 UdpAppender 將日志以無連接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ù)。具體例子詳見上文 2.2 Appender 節(jié)點(diǎn)配置詳解 。
額外補(bǔ)充下 filter 的類型說明:
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 的類型。具體例子詳見上文 2.2 Appender 節(jié)點(diǎn)配置詳解 。
額外補(bǔ)充 layout 節(jié)點(diǎn)的 type 屬性取值:
ExceptionLayout 只呈現(xiàn)日志事件中異常的文本信息 PatternLayout 可以通過類型字符串來配置的布局 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ùn)行的時(shí)刻,格式%date{yyyy-MM-dd HH:mm:ss,fff} %r、%timestamp 輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語句時(shí)消耗的毫秒數(shù) %p、%level 日志的當(dāng)前優(yōu)先級(jí)別 %c、%logger 當(dāng)前日志對(duì)象的名稱 %L、%line 輸出語句所在的行號(hào) %F、%file 輸出語句所在的文件名,警告:只在調(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ā)日志事件的線程,如果沒有線程名就使用線程號(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ì)齊 | 最小寬 | 最大寬 | 說明 |
---|---|---|---|---|
%20logger | 右對(duì)齊 | 20 | 無 | 如果logger名不足20個(gè)字符,就在左邊補(bǔ)空格 |
%-20logger | 左對(duì)齊 | 20 | 無 | 如果logger名不足20個(gè)字符,就在右邊補(bǔ)空格 |
%.30logger | 左對(duì)齊 | 無 | 30 | 超過30個(gè)字符將截?cái)?/td> |
%20.30logger | 右對(duì)齊 | 20 | 30 | logger名要在20到30之間,少了在左邊補(bǔ)空格,多了截?cái)?/td> |
%-20.30logger | 左對(duì)齊 | 20 | 30 | logger名要在20到30之間,少了在右邊補(bǔ)空格,多了截?cái)?/td> |
3. 如何輸出自定義類
自定義擴(kuò)展輸出,通過繼承 log4net.Layout.PatternLayout 和 log4net.Layout.Pattern.PatternLayoutConverter 類,使用 log4net.Core.LoggingEvent 類的方法得到了要輸出的 LogEntity 類的名稱。
然后通過反射得到各個(gè)屬性的值,使用 PatternLayout 類 AddConverter 方法傳入得到的值,在 PatternLayoutConverter 中對(duì)其進(jìn)行處理。注意配置文件 Appender 中的 Layout type 用到的類的命名空間以及類名,要同步更改為自定義類的。詳見示例:
自定義拓展類的代碼
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--> <!--如果沒有定義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>
接下來我們新建一個(gè)類 LabwareModel,并在幫助類 Log4Helper 中添加調(diào)用 CustomLog 的方法,來測(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 的文件。打開文件會(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)文章
ASP.NET The system cannot find the file specified解決辦法
這篇文章主要介紹了ASP.NET The system cannot find the file specified解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11asp.net 枚舉文件里面的數(shù)字綁定到DropDownList里面去
將枚舉文件里面的數(shù)字綁定到DropDownList里面去的實(shí)現(xiàn)方法,大家可以借鑒下。2009-07-07詳解如何在ASP.Net Core中實(shí)現(xiàn)健康檢查
這篇文章主要介紹了詳解如何在ASP.Net Core中實(shí)現(xiàn)健康檢查,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03iis訪問出現(xiàn)各種問題(Vs訪問正常)的部分處理方法詳細(xì)整理
在vs中調(diào)試都可以正常,但是在iis訪問就會(huì)出現(xiàn)各種問題,很是疑惑索性把這些問題整理一下,這樣更容易的可以處理方法說明清楚,感興趣的朋友可以了解下2013-01-01.net 應(yīng)對(duì)網(wǎng)站訪問壓力的方案總結(jié)
本文將總結(jié)下一些應(yīng)對(duì)網(wǎng)站訪問壓力的技術(shù)方案。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02swagger上傳文件并支持jwt認(rèn)證的實(shí)現(xiàn)方法
今天通過本文給大家分享swagger上傳文件并支持jwt認(rèn)證的實(shí)現(xiàn)方法,文中提到了安裝方法及實(shí)現(xiàn)代碼,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05ASP.NET網(wǎng)站管理系統(tǒng)退出 清除瀏覽器緩存,Session的代碼
管理系統(tǒng)退出登陸后,將網(wǎng)址重新輸入后還會(huì)看到用戶登陸后的界面,為了解決這個(gè)問題,我采用了以下方法,需要的朋友可以參考下2012-05-05asp.net 中國(guó)身份證號(hào)碼驗(yàn)證代碼 非正則
asp.net 中國(guó)身份證號(hào)碼驗(yàn)證,需要的朋友可以參考下。2009-11-11Discuz!NT 3與asp.net 整合的實(shí)例教程
本次整合只針對(duì)NETSNS中的代碼做了少許修改,完成了基本的和論壇同步注冊(cè),登陸和注銷,信息獲取,信息修改。為的是給各位Discuz!NT API愛好者做一個(gè)簡(jiǎn)單的API事例,供大家參考。2009-11-11