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)的說(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ù)制,如下圖:

1.3 在項(xiàng)目中引入該配置文件
這里有兩種方式引入配置文件。
1.3.1 在項(xiàng)目的 AssemblyInfo.cs 中引入配置文件
首先在項(xiàng)目中新建一個(gè)Config文件夾,將之前創(chuàng)建的log4net.config文件放入其中,隨后在 AssemblyInfo.cs 中添加如下語(yǔ)句:

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ì)齊 | 20 | 30 | logger名要在20到30之間,少了在左邊補(bǔ)空格,多了截?cái)?/td> |
| %-20.30logger | 左對(duì)齊 | 20 | 30 | logger名要在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)文章
ASP.NET The system cannot find the file specified解決辦法
這篇文章主要介紹了ASP.NET The system cannot find the file specified解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11
asp.net 枚舉文件里面的數(shù)字綁定到DropDownList里面去
將枚舉文件里面的數(shù)字綁定到DropDownList里面去的實(shí)現(xiàn)方法,大家可以借鑒下。2009-07-07
詳解如何在ASP.Net Core中實(shí)現(xiàn)健康檢查
這篇文章主要介紹了詳解如何在ASP.Net Core中實(shí)現(xiàn)健康檢查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
iis訪問(wèn)出現(xiàn)各種問(wèn)題(Vs訪問(wèn)正常)的部分處理方法詳細(xì)整理
在vs中調(diào)試都可以正常,但是在iis訪問(wèn)就會(huì)出現(xiàn)各種問(wèn)題,很是疑惑索性把這些問(wèn)題整理一下,這樣更容易的可以處理方法說(shuō)明清楚,感興趣的朋友可以了解下2013-01-01
.net 應(yīng)對(duì)網(wǎng)站訪問(wèn)壓力的方案總結(jié)
本文將總結(jié)下一些應(yīng)對(duì)網(wǎng)站訪問(wèn)壓力的技術(shù)方案。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
swagger上傳文件并支持jwt認(rèn)證的實(shí)現(xiàn)方法
今天通過(guò)本文給大家分享swagger上傳文件并支持jwt認(rèn)證的實(shí)現(xiàn)方法,文中提到了安裝方法及實(shí)現(xiàn)代碼,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
ASP.NET網(wǎng)站管理系統(tǒng)退出 清除瀏覽器緩存,Session的代碼
管理系統(tǒng)退出登陸后,將網(wǎng)址重新輸入后還會(huì)看到用戶登陸后的界面,為了解決這個(gè)問(wèn)題,我采用了以下方法,需要的朋友可以參考下2012-05-05
asp.net 中國(guó)身份證號(hào)碼驗(yàn)證代碼 非正則
asp.net 中國(guó)身份證號(hào)碼驗(yàn)證,需要的朋友可以參考下。2009-11-11
Discuz!NT 3與asp.net 整合的實(shí)例教程
本次整合只針對(duì)NETSNS中的代碼做了少許修改,完成了基本的和論壇同步注冊(cè),登陸和注銷,信息獲取,信息修改。為的是給各位Discuz!NT API愛(ài)好者做一個(gè)簡(jiǎn)單的API事例,供大家參考。2009-11-11

