Log4Net配置詳解及輸出自定義消息類示例代碼
1.簡單使用實例
1.1 添加log4net.dll的引用。
在NuGet程序包中搜索log4net并添加,此次我所用版本為2.0.17。如下圖:
1.2 添加配置文件
右鍵項目,添加新建項,搜索選擇應(yīng)用程序配置文件,命名為log4net.config,步驟如下圖:
1.2.1 log4net.config簡單配置示例
下面是一個簡單的配置示例,詳細節(jié)點及相應(yīng)的說明詳見 2. 配置文件節(jié)點詳解 。
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"> <!--絕對路徑--> <!--<file value="D:\KangarooLog.txt"></file>--> <!--日志輸出到exe程序這個相對目錄下--> <file value="../../Log/DefalutLog" /> <!--相對路徑,在項目的根目錄下--> <!--以最后一個路徑為準,所以上面的絕對路徑下不會寫日志--> <!--<file value="./Log/Kangaroo.txt"></file>--> <!--防止多線程時不能寫Log,官方說線程非安全--> <!--實際使用時,本地測試正常,部署后沒有不能寫日志的情況--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--追加日志內(nèi)容,true后續(xù)輸出的日志會追加到之前的日志文件--> <appendToFile value="true" /> <!--可以為:Once|Size|Date|Composite--> <!--Composite為Size和Date的組合--> <rollingStyle value="Composite" /> <!--日志最大個數(shù),都是最新的--> <!--rollingStyle節(jié)點為Date時,該節(jié)點不起作用--> <!--rollingStyle節(jié)點為Size時,只能有value個日志--> <!--rollingStyle節(jié)點為Composite時,每天有value個日志--> <maxSizeRollBackups value="10" /> <!--當備份文件時,為文件名加的后綴--> <!--后綴為*.txt時,例:AX.txt_2008-07-24.PxP 應(yīng)該是程序上的一個bug--> <!--后綴為*.TXT時,例:AX.txt_2008-07-25.TXT--> <datePattern value="_yyyy-MM-dd'.log'" /> <!--每個文件的大小。只在混合方式與文件大小方式下使用。超出大小后在所有文件名后自動增加正整數(shù)重新命名,數(shù)字最大的最早寫入??捎玫膯挝?KB|MB|GB。不要使用小數(shù),否則會一直寫入當前日志--> <maximumFileSize value="10MB" /> <!--置為true,當前最新日志文件名永遠為file節(jié)中的名字--> <staticLogFileName value="false" /> <!--輸出級別在INFO和ERROR之間的日志--> <!--<filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="ERROR" /> </filter>--> <!--必須結(jié)合起來用,第一個只過濾出WARN,第二個拒絕其它其它日志輸出--> <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【日志級別】%-5level %n【記錄時間】%date %n【執(zhí)行時間】[%r]毫秒 %n【執(zhí)行Log分類的名稱】%logger %n【傳入信息內(nèi)容】%message %n=========="/> </layout> </appender> </log4net> </configuration> <!--==================================layout節(jié)點的配置說明==================================--> <!-- Made By YSL --> <!-- %m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息 --> <!-- %n(new line):換行 --> <!-- %d(datetime):輸出當前語句運行的時刻 --> <!-- %r(run time):輸出程序從運行到執(zhí)行到當前語句時消耗的毫秒數(shù) --> <!-- %t(thread id):當前語句所在的線程ID --> <!-- %p(priority): 日志的當前優(yōu)先級別,即DEBUG、INFO、WARN…等 --> <!-- %c(class):當前日志對象的名稱,例如: --> <!-- 模式字符串為:%-10c -%m%n --> <!-- 代碼為: --> <!-- ILog log=LogManager.GetLogger(“Exam.Log”); --> <!-- log.Debug(“Hello”); --> <!-- 則輸出為下面的形式: --> <!-- Exam.Log - Hello --> <!-- %L:輸出語句所在的行號 --> <!-- %F:輸出語句所在的文件名 --> <!-- %-數(shù)字:表示該項的最小長度,如果不夠,則用空格填充 -->
1.2.2 設(shè)置log4net.config配置文件屬性
點擊log4net.config,將其文件屬性設(shè)為始終復(fù)制,如下圖:
1.3 在項目中引入該配置文件
這里有兩種方式引入配置文件。
1.3.1 在項目的 AssemblyInfo.cs 中引入配置文件
首先在項目中新建一個Config文件夾,將之前創(chuàng)建的log4net.config文件放入其中,隨后在 AssemblyInfo.cs 中添加如下語句:
1.3.2 在項目運行時動態(tài)引入配置文件
使用固定語句引入配置文件,如下所示,其中,configFilePath 為配置文件的絕對路徑。
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(configFilePath));
1.4 創(chuàng)建幫助類使用日志進行記錄
我們首先創(chuàng)建名為 Log4Helper 的類,并使用固定的log4net.LogManager.GetLogger()
語句實例化對應(yīng)的Log對象,然后調(diào)用其對應(yīng)的方法即可寫入日志。示例代碼如下:
Log4Helper代碼
public class Log4Helper { private static readonly log4net.ILog logDefault = log4net.LogManager.GetLogger("DefaultLog"); /// <summary> /// 測試默認配置信息輸出(輸出范圍做了限制) /// </summary> public static void TestDefaultLog() { logDefault.Debug("這是條調(diào)試信息"); logDefault.Info("這是條提示信息"); logDefault.Warn("這是條警告信息"); logDefault.Error("這是條錯誤信息"); logDefault.Fatal("這是條致命錯誤信息"); } /// <summary> /// Log4Net初始化(可讀取自定義配置) /// </summary> /// <param name="configFilePath"></param> public static void Log4NetInit(string configFilePath) { log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(configFilePath)); } /// <summary> /// 返回指定名稱的日志對象 /// </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é)點中的地址,在項目中會生成 Log 文件夾,該文件夾下會生成類似 DefalutLog_2024-07-01.log 的文件。該文件名由 file 節(jié)點和 datePattern 節(jié)點兩部分組合而成,其中,staticLogFileName
節(jié)點需要被設(shè)置為 false ,若為 true ,則當前最新日志文件名永遠為 file 節(jié)點中的名字,其余日志會根據(jù) datePattern 節(jié)點自動添加后綴。
打開日志文件,會發(fā)現(xiàn)里面只有 WARN 警告信息,例如:
========== 【日志級別】WARN 【記錄時間】2024-07-01 00:18:28,828 【執(zhí)行時間】[53]毫秒 【執(zhí)行Log分類的名稱】DefaultLog 【傳入信息內(nèi)容】這是條警告信息 ==========
這是因為配置中的 filter 過濾節(jié)點,詳見注釋,將其注釋再次運行,則會正常顯示全部日志信息。
2. 配置文件節(jié)點詳解
log4net的主要組成有四部分,分別是 Logger、Appender、Layout、Filter等,詳見下方。
2.1 Logger 節(jié)點配置詳解
以上文的配置為例解釋:
<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 定義記錄的日志級別,就是說,你要記錄哪個級別以上的日志,級別由低到高依次是:
ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
如果你 level 定義 INFO,那么低于 INFO 級別以下的信息,將不會記入日志,啥意思呢?
就是說,就算你在程序里,用 log.Debug() 來寫入一個日志信息,可是你在配置中指定 level 為 INFO,由于 DEBUG 級別低于 INFO,所以,不會被記入日志。這樣的處理非常靈活。
在具體寫日志時,一般可以這樣理解日志等級:
FATAL(致命錯誤):記錄系統(tǒng)中出現(xiàn)的能使用系統(tǒng)完全失去功能,服務(wù)停止,系統(tǒng)崩潰等使系統(tǒng)無法繼續(xù)運行下去的錯誤。例如,數(shù)據(jù)庫無法連接,系統(tǒng)出現(xiàn)死循環(huán)。
ERROR(一般錯誤):記錄系統(tǒng)中出現(xiàn)的導(dǎo)致系統(tǒng)不穩(wěn)定,部分功能出現(xiàn)混亂或部分功能失效一類的錯誤。例如,數(shù)據(jù)字段為空,數(shù)據(jù)操作不可完成,操作出現(xiàn)異常等。
WARN(警告):記錄系統(tǒng)中不影響系統(tǒng)繼續(xù)運行,但不符合系統(tǒng)運行正常條件,有可能引起系統(tǒng)錯誤的信息。例如,記錄內(nèi)容為空,數(shù)據(jù)內(nèi)容不正確等。
INFO(一般信息):記錄系統(tǒng)運行中應(yīng)該讓用戶知道的基本信息。例如,服務(wù)開始運行,功能已經(jīng)開戶等。
DEBUG (調(diào)試信息):記錄系統(tǒng)用于調(diào)試的一切信息,內(nèi)容或者是一些關(guān)鍵數(shù)據(jù)內(nèi)容的輸出。
appender-ref,要引用的 appender 的名字,由 Layout 控制輸出格式。
最后還要說一個LogManager類,它用來管理所有的Logger。它的GetLogger靜態(tài)方法,可以獲得配置文件中相應(yīng)的Logger:
log4net.ILog log = log4net.LogManager.GetLogger("logger-name");
2.2 Appender 節(jié)點配置詳解
以上文的 FileAppenderDefault 節(jié)點為例:
FileAppenderDefault 節(jié)點配置
<!-- appender 定義日志輸出方式 將日志以回滾文件的形式寫到文件中。--> <appender name="FileAppenderDefault" type="log4net.Appender.RollingFileAppender"> <!--絕對路徑--> <!--<file value="D:\KangarooLog.txt"></file>--> <!--日志輸出到exe程序這個相對目錄下--> <file value="../../Log/DefalutLog" /> <!--相對路徑,在項目的根目錄下--> <!--以最后一個路徑為準,所以上面的絕對路徑下不會寫日志--> <!--<file value="./Log/Kangaroo.txt"></file>--> <!--防止多線程時不能寫Log,官方說線程非安全--> <!--實際使用時,本地測試正常,部署后沒有不能寫日志的情況--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--追加日志內(nèi)容,true后續(xù)輸出的日志會追加到之前的日志文件--> <appendToFile value="true" /> <!--可以為:Once|Size|Date|Composite--> <!--Composite為Size和Date的組合--> <rollingStyle value="Composite" /> <!--日志最大個數(shù),都是最新的--> <!--rollingStyle節(jié)點為Date時,該節(jié)點不起作用--> <!--rollingStyle節(jié)點為Size時,只能有value個日志--> <!--rollingStyle節(jié)點為Composite時,每天有value個日志--> <maxSizeRollBackups value="10" /> <!--當備份文件時,為文件名加的后綴--> <!--后綴為*.txt時,例:AX.txt_2008-07-24.PxP 應(yīng)該是程序上的一個bug--> <!--后綴為*.TXT時,例:AX.txt_2008-07-25.TXT--> <datePattern value="_yyyy-MM-dd'.log'" /> <!--每個文件的大小。只在混合方式與文件大小方式下使用。超出大小后在所有文件名后自動增加正整數(shù)重新命名,數(shù)字最大的最早寫入??捎玫膯挝?KB|MB|GB。不要使用小數(shù),否則會一直寫入當前日志--> <maximumFileSize value="10MB" /> <!--置為true,當前最新日志文件名永遠為file節(jié)中的名字--> <staticLogFileName value="false" /> <!--輸出級別在INFO和ERROR之間的日志--> <!--<filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="ERROR" /> </filter>--> <!--必須結(jié)合起來用,第一個只過濾出WARN,第二個拒絕其它其它日志輸出--> <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【日志級別】%-5level %n【記錄時間】%date %n【執(zhí)行時間】[%r]毫秒 %n【執(zhí)行Log分類的名稱】%logger %n【傳入信息內(nèi)容】%message %n=========="/> </layout> </appender>
每個節(jié)點均寫有注釋,這里額外介紹下 appender 的輸出方式( type 屬性),如下所示:
appender 輸出方式
AdoNetAppender 將日志記錄到數(shù)據(jù)庫中??梢圆捎肧QL和存儲過程兩種方式。 AnsiColorTerminalAppender 將日志高亮輸出到ANSI終端。 AspNetTraceAppender 能用asp.net中Trace的方式查看記錄的日志。 BufferingForwardingAppender 在輸出到子Appenders之前先緩存日志事件。 ConsoleAppender 將日志輸出到應(yīng)用程序控制臺。 EventLogAppender 將日志寫到Windows Event Log。 FileAppender 將日志輸出到文件。 ForwardingAppender 發(fā)送日志事件到子Appenders。 LocalSyslogAppender 將日志寫到local syslog service (僅用于UNIX環(huán)境下)。 MemoryAppender 將日志存到內(nèi)存緩沖區(qū)。 NetSendAppender 將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示。 OutputDebugStringAppender 將日志輸出到Debuger,如果程序沒有Debuger,就輸出到系統(tǒng)Debuger。如果系統(tǒng)Debuger也不可用,將忽略消息。 RemoteSyslogAppender 通過UDP網(wǎng)絡(luò)協(xié)議將日志寫到Remote syslog service。 RemotingAppender 通過.NET Remoting將日志寫到遠程接收端。 RollingFileAppender 將日志以回滾文件的形式寫到文件中。 SmtpAppender 將日志寫到郵件中。 SmtpPickupDirAppender 將消息以文件的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發(fā)送它們。 TelnetAppender 客戶端通過Telnet來接受日志事件。 TraceAppender 將日志寫到.NET trace 系統(tǒng)。 UdpAppender 將日志以無連接UDP數(shù)據(jù)報的形式送到遠程宿主或用UdpClient的形式廣播。
2.3 Filter 節(jié)點配置詳解
filter只能作為 appender 的子元素,type 屬性表示 Filter 的類型。常用子元素 param 數(shù)量0個或多個,作用設(shè)置一些參數(shù)。具體例子詳見上文 2.2 Appender 節(jié)點配置詳解 。
額外補充下 filter 的類型說明:
DenyAllFilter 阻止所有的日志事件被記錄 LevelMatchFilter 只有指定等級的日志事件才被記錄 LevelRangeFilter 日志等級在指定范圍內(nèi)的事件才被記錄 LoggerMatchFilter Logger名稱匹配,才記錄 PropertyFilter 消息匹配指定的屬性值時才被記錄 StringMathFilter 消息匹配指定的字符串才被記錄
2.4 Layout 節(jié)點配置詳解
layout 節(jié)點只能作為 appender 的子元素。type 屬性表示 Layout 的類型。具體例子詳見上文 2.2 Appender 節(jié)點配置詳解 。
額外補充 layout 節(jié)點的 type 屬性取值:
ExceptionLayout 只呈現(xiàn)日志事件中異常的文本信息 PatternLayout 可以通過類型字符串來配置的布局 RawPropertyLayout 從日志事件中提取屬性值 RawTimeStampLayout 從日志事件中提取日期 RawUtcTimeStampLayout 從日志事件中提取UTC日期 SimpleLayout 很簡單的布局 XmlLayout 把日志事件格式化為XML元素的布局
這其中我們主要使用的還是PatternLayout 類型,而在 ConversionPattern 節(jié)點中,我們可以進一步的配置日志輸出格式,以 PatterLayout 的格式化字符串輸出為例:
PatterLayout 的格式化字符串
%m、%message 輸出的日志消息 %d、%datetime 輸出當前語句運行的時刻,格式%date{yyyy-MM-dd HH:mm:ss,fff} %r、%timestamp 輸出程序從運行到執(zhí)行到當前語句時消耗的毫秒數(shù) %p、%level 日志的當前優(yōu)先級別 %c、%logger 當前日志對象的名稱 %L、%line 輸出語句所在的行號 %F、%file 輸出語句所在的文件名,警告:只在調(diào)試的時候有效,調(diào)用本地信息會影響性能 %a、%appdomain 引發(fā)日志事件的應(yīng)用程序域的名稱。 %C、%class、%type 引發(fā)日志請求的類的全名,警告:會影響性能 %exception 異常信息 %u、%identity 當前活動用戶的名字,我測試的時候%identity返回都是空的。警告:會影響性能 %l、%location 引發(fā)日志事件的名空間、類名、方法、行號。警告:會影響性能,依賴pdb文件 %M、%method 發(fā)生日志請求的方法名,警告:會影響性能 %n、%newline 換行符 %x、%ndc NDC(nested diagnostic context) %X、%mdc、%P、%properties 等介于 %property %property 輸出{log4net:Identity=, log4net:UserName=, log4net:HostName=} %t、%thread 引發(fā)日志事件的線程,如果沒有線程名就使用線程號。 %w、%username 當前用戶的WindowsIdentity,類似:HostName/Username。警告:會影響性能 %utcdate 發(fā)生日志事件的UTC時間。例如:%utcdate{HH:mm:ss,fff} %% 輸出一個百分號
額外補充下 PatterLayout 格式修飾符:
格式修飾符 | 對齊 | 最小寬 | 最大寬 | 說明 |
---|---|---|---|---|
%20logger | 右對齊 | 20 | 無 | 如果logger名不足20個字符,就在左邊補空格 |
%-20logger | 左對齊 | 20 | 無 | 如果logger名不足20個字符,就在右邊補空格 |
%.30logger | 左對齊 | 無 | 30 | 超過30個字符將截斷 |
%20.30logger | 右對齊 | 20 | 30 | logger名要在20到30之間,少了在左邊補空格,多了截斷 |
%-20.30logger | 左對齊 | 20 | 30 | logger名要在20到30之間,少了在右邊補空格,多了截斷 |
3. 如何輸出自定義類
自定義擴展輸出,通過繼承 log4net.Layout.PatternLayout 和 log4net.Layout.Pattern.PatternLayoutConverter 類,使用 log4net.Core.LoggingEvent 類的方法得到了要輸出的 LogEntity 類的名稱。
然后通過反射得到各個屬性的值,使用 PatternLayout 類 AddConverter 方法傳入得到的值,在 PatternLayoutConverter 中對其進行處理。注意配置文件 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); } } } } } }
與之對應(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【日志級別】%-5level %n【記錄時間】%date %n【執(zhí)行時間】[%r]毫秒 %n【執(zhí)行線程ID】[%thread] %n【執(zhí)行Log分類的名稱】%logger %n【耗材類型名】%Custom{LabTypeName} %n【耗材名】%Custom{LabName} %n【耗材編號】%Custom{LabNumber} %n【是否吸頭】%Custom{IsTip} %n【傳入信息內(nèi)容/類型】%message %n==========" /> </layout> </appender>
接下來我們新建一個類 LabwareModel,并在幫助類 Log4Helper 中添加調(diào)用 CustomLog 的方法,來測試能否輸出自定義類 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> /// 生成默認實例 /// </summary> /// <returns></returns> public static LabwareModel GetLabwareModel() { LabwareModel labwareModel = new LabwareModel(); return labwareModel; } /// <summary> /// 測試自定義配置信息輸出 /// </summary> public static void TestCustomLog() { var labware = GetLabwareModel(); logCustom.Debug("這是條調(diào)試信息"); logCustom.Info("這是條提示信息"); logCustom.Warn("這是條警告信息"); logCustom.Error(labware); logCustom.Fatal("這是條致命錯誤信息"); }
在主程序中調(diào)用進行測試:
private void Application_Startup(object sender, StartupEventArgs e) { Log4Helper.TestCustomLog(); Log4Helper.TestDefaultLog(); }
根據(jù)上面 FileAppenderCustom 配置中 file 節(jié)點中的地址,在項目中會生成 Log 文件夾,該文件夾下會生成類似 CustomLog_2024-07-01.log 的文件。打開文件會看到輸出內(nèi)容如下:
日志輸出內(nèi)容
========== 【日志級別】DEBUG 【記錄時間】2024-07-01 00:18:28,812 【執(zhí)行時間】[37]毫秒 【執(zhí)行線程ID】[1] 【執(zhí)行Log分類的名稱】CustomLog 【耗材類型名】 【耗材名】 【耗材編號】 【是否吸頭】 【傳入信息內(nèi)容/類型】這是條調(diào)試信息 ========== ========== 【日志級別】INFO 【記錄時間】2024-07-01 00:18:28,823 【執(zhí)行時間】[48]毫秒 【執(zhí)行線程ID】[1] 【執(zhí)行Log分類的名稱】CustomLog 【耗材類型名】 【耗材名】 【耗材編號】 【是否吸頭】 【傳入信息內(nèi)容/類型】這是條提示信息 ========== ========== 【日志級別】WARN 【記錄時間】2024-07-01 00:18:28,825 【執(zhí)行時間】[50]毫秒 【執(zhí)行線程ID】[1] 【執(zhí)行Log分類的名稱】CustomLog 【耗材類型名】 【耗材名】 【耗材編號】 【是否吸頭】 【傳入信息內(nèi)容/類型】這是條警告信息 ========== ========== 【日志級別】ERROR 【記錄時間】2024-07-01 00:18:28,826 【執(zhí)行時間】[51]毫秒 【執(zhí)行線程ID】[1] 【執(zhí)行Log分類的名稱】CustomLog 【耗材類型名】采樣管 【耗材名】Custom_2000ul 【耗材編號】200 【是否吸頭】1 【傳入信息內(nèi)容/類型】WPFPractice.LabwareModel ========== ========== 【日志級別】FATAL 【記錄時間】2024-07-01 00:18:28,828 【執(zhí)行時間】[53]毫秒 【執(zhí)行線程ID】[1] 【執(zhí)行Log分類的名稱】CustomLog 【耗材類型名】 【耗材名】 【耗材編號】 【是否吸頭】 【傳入信息內(nèi)容/類型】這是條致命錯誤信息 ==========
以上就是關(guān)于 Log4Net 配置詳解。
到此這篇關(guān)于Log4Net配置詳解及輸出自定義消息類示例 的文章就介紹到這了,更多相關(guān)Log4Net配置輸出自定義消息類內(nèi)容請搜索腳本之家以前的文章或繼續(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里面去的實現(xiàn)方法,大家可以借鑒下。2009-07-07詳解如何在ASP.Net Core中實現(xiàn)健康檢查
這篇文章主要介紹了詳解如何在ASP.Net Core中實現(xiàn)健康檢查,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03iis訪問出現(xiàn)各種問題(Vs訪問正常)的部分處理方法詳細整理
在vs中調(diào)試都可以正常,但是在iis訪問就會出現(xiàn)各種問題,很是疑惑索性把這些問題整理一下,這樣更容易的可以處理方法說明清楚,感興趣的朋友可以了解下2013-01-01.net 應(yīng)對網(wǎng)站訪問壓力的方案總結(jié)
本文將總結(jié)下一些應(yīng)對網(wǎng)站訪問壓力的技術(shù)方案。具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02swagger上傳文件并支持jwt認證的實現(xiàn)方法
今天通過本文給大家分享swagger上傳文件并支持jwt認證的實現(xiàn)方法,文中提到了安裝方法及實現(xiàn)代碼,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05ASP.NET網(wǎng)站管理系統(tǒng)退出 清除瀏覽器緩存,Session的代碼
管理系統(tǒng)退出登陸后,將網(wǎng)址重新輸入后還會看到用戶登陸后的界面,為了解決這個問題,我采用了以下方法,需要的朋友可以參考下2012-05-05