Log4Net配置詳解及輸出自定義訊息類示例

letmebaby發表於2024-07-04

1.簡單使用例項

1.1 新增log4net.dll的引用。

  在NuGet程式包中搜尋log4net並新增,此次我所用版本為2.0.17。如下圖:

image

1.2 新增配置檔案

  右鍵專案,新增新建項,搜尋選擇應用程式配置檔案,命名為log4net.config,步驟如下圖:

image

1.2.1 log4net.config簡單配置示例

  下面是一個簡單的配置示例,詳細節點及相應的說明詳見 2. 配置檔案節點詳解

點選檢視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" />
		<!--追加日誌內容,true後續輸出的日誌會追加到之前的日誌檔案-->
		<appendToFile value="true" />
		<!--可以為:Once|Size|Date|Composite-->
		<!--Composite為Size和Date的組合-->
		<rollingStyle value="Composite" />
		<!--日誌最大個數,都是最新的-->
		<!--rollingStyle節點為Date時,該節點不起作用-->
		<!--rollingStyle節點為Size時,只能有value個日誌-->
		<!--rollingStyle節點為Composite時,每天有value個日誌-->
		<maxSizeRollBackups value="10" />
		<!--當備份檔案時,為檔名加的字尾-->
		<!--字尾為*.txt時,例:AX.txt_2008-07-24.PxP  應該是程式上的一個bug-->
		<!--字尾為*.TXT時,例:AX.txt_2008-07-25.TXT-->
		<datePattern value="_yyyy-MM-dd'.log'" />
		<!--每個檔案的大小。只在混合方式與檔案大小方式下使用。超出大小後在所有檔名後自動增加正整數重新命名,數字最大的最早寫入。可用的單位:KB|MB|GB。不要使用小數,否則會一直寫入當前日誌-->
		<maximumFileSize value="10MB" />
		<!--置為true,當前最新日誌檔名永遠為file節中的名字-->
		<staticLogFileName value="false" />
		<!--輸出級別在INFO和ERROR之間的日誌-->
		<!--<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="INFO" />
			<param name="LevelMax" value="ERROR" />
		</filter>-->
		<!--必須結合起來用,第一個只過濾出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【執行時間】[%r]毫秒
			%n【執行Log分類的名稱】%logger
			%n【傳入資訊內容】%message
			%n=========="/>
		</layout>
	</appender>
</log4net>
</configuration>
<!--==================================layout節點的配置說明==================================-->
<!--                                                                        Made By YSL      -->
<!--        %m(message):輸出的日誌訊息,如ILog.Debug(…)輸出的一條訊息                          -->
<!--        %n(new line):換行                                                                   -->
<!--        %d(datetime):輸出當前語句執行的時刻                                                 -->
<!--        %r(run time):輸出程式從執行到執行到當前語句時消耗的毫秒數                           -->
<!--        %t(thread id):當前語句所在的執行緒ID                                                  -->
<!--        %p(priority): 日誌的當前優先順序別,即DEBUG、INFO、WARN…等                           -->
<!--        %c(class):當前日誌物件的名稱,例如:                                                -->
<!--               模式字串為:%-10c -%m%n                                                    -->
<!--               程式碼為:                                                                     -->
<!--        ILog log=LogManager.GetLogger(“Exam.Log”);                                        -->
<!--        log.Debug(“Hello”);                                                               -->
<!--            則輸出為下面的形式:                                                            -->
<!--        Exam.Log       - Hello                                                              -->
<!--        %L:輸出語句所在的行號                                                              -->
<!--        %F:輸出語句所在的檔名                                                            -->
<!--        %-數字:表示該項的最小長度,如果不夠,則用空格填充                                  -->

1.2.2 設定log4net.config配置檔案屬性

  點選log4net.config,將其檔案屬性設為始終複製,如下圖:

image

1.3 在專案中引入該配置檔案

  這裡有兩種方式引入配置檔案。

1.3.1 在專案的 AssemblyInfo.cs 中引入配置檔案

  首先在專案中新建一個Config資料夾,將之前建立的log4net.config檔案放入其中,隨後在 AssemblyInfo.cs 中新增如下語句:

image

1.3.2 在專案執行時動態引入配置檔案

  使用固定語句引入配置檔案,如下所示,其中,configFilePath 為配置檔案的絕對路徑。

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

1.4 建立幫助類使用日誌進行記錄

  我們首先建立名為 Log4Helper 的類,並使用固定的log4net.LogManager.GetLogger()語句例項化對應的Log物件,然後呼叫其對應的方法即可寫入日誌。示例程式碼如下:

點選檢視Log4Helper程式碼
 public class Log4Helper
 {
     private static readonly log4net.ILog logDefault = log4net.LogManager.GetLogger("DefaultLog");

     /// <summary>
     /// 測試預設配置資訊輸出(輸出範圍做了限制)
     /// </summary>
     public static void TestDefaultLog()
     {
         logDefault.Debug("這是條除錯資訊");
         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();
 }

  根據上面 log4net.config 配置中 file 節點中的地址,在專案中會生成 Log 資料夾,該資料夾下會生成類似 DefalutLog_2024-07-01.log 的檔案。該檔名由 file 節點和 datePattern 節點兩部分組合而成,其中,staticLogFileName節點需要被設定為 false ,若為 true ,則當前最新日誌檔名永遠為 file 節點中的名字,其餘日誌會根據 datePattern 節點自動新增字尾。

  開啟日誌檔案,會發現裡面只有 WARN 警告資訊,例如:

==========                     
【日誌級別】WARN                      
【記錄時間】2024-07-01 00:18:28,828                     
【執行時間】[53]毫秒                     
【執行Log分類的名稱】DefaultLog              
【傳入資訊內容】這是條警告資訊             
==========

  這是因為配置中的 filter 過濾節點,詳見註釋,將其註釋再次執行,則會正常顯示全部日誌資訊。

2. 配置檔案節點詳解

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

2.1 Logger 節點配置詳解

  以上文的配置為例解釋:

<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(致命錯誤):記錄系統中出現的能使用系統完全失去功能,服務停止,系統崩潰等使系統無法繼續執行下去的錯誤。例如,資料庫無法連線,系統出現死迴圈。

ERROR(一般錯誤):記錄系統中出現的導致系統不穩定,部分功能出現混亂或部分功能失效一類的錯誤。例如,資料欄位為空,資料操作不可完成,操作出現異常等。

WARN(警告):記錄系統中不影響系統繼續執行,但不符合系統執行正常條件,有可能引起系統錯誤的資訊。例如,記錄內容為空,資料內容不正確等。

INFO(一般資訊):記錄系統執行中應該讓使用者知道的基本資訊。例如,服務開始執行,功能已經開戶等。

DEBUG (除錯資訊):記錄系統用於除錯的一切資訊,內容或者是一些關鍵資料內容的輸出。

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

  最後還要說一個LogManager類,它用來管理所有的Logger。它的GetLogger靜態方法,可以獲得配置檔案中相應的Logger:

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

2.2 Appender 節點配置詳解

  以上文的 FileAppenderDefault 節點為例:

點選檢視 FileAppenderDefault 節點配置
	<!-- 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" />
		<!--追加日誌內容,true後續輸出的日誌會追加到之前的日誌檔案-->
		<appendToFile value="true" />
		<!--可以為:Once|Size|Date|Composite-->
		<!--Composite為Size和Date的組合-->
		<rollingStyle value="Composite" />
		<!--日誌最大個數,都是最新的-->
		<!--rollingStyle節點為Date時,該節點不起作用-->
		<!--rollingStyle節點為Size時,只能有value個日誌-->
		<!--rollingStyle節點為Composite時,每天有value個日誌-->
		<maxSizeRollBackups value="10" />
		<!--當備份檔案時,為檔名加的字尾-->
		<!--字尾為*.txt時,例:AX.txt_2008-07-24.PxP  應該是程式上的一個bug-->
		<!--字尾為*.TXT時,例:AX.txt_2008-07-25.TXT-->
		<datePattern value="_yyyy-MM-dd'.log'" />
		<!--每個檔案的大小。只在混合方式與檔案大小方式下使用。超出大小後在所有檔名後自動增加正整數重新命名,數字最大的最早寫入。可用的單位:KB|MB|GB。不要使用小數,否則會一直寫入當前日誌-->
		<maximumFileSize value="10MB" />
		<!--置為true,當前最新日誌檔名永遠為file節中的名字-->
		<staticLogFileName value="false" />
		<!--輸出級別在INFO和ERROR之間的日誌-->
		<!--<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="INFO" />
			<param name="LevelMax" value="ERROR" />
		</filter>-->
		<!--必須結合起來用,第一個只過濾出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【執行時間】[%r]毫秒
			%n【執行Log分類的名稱】%logger
			%n【傳入資訊內容】%message
			%n=========="/>
		</layout>
	</appender>

  每個節點均寫有註釋,這裡額外介紹下 appender 的輸出方式( type 屬性),如下所示:

點選檢視 appender 輸出方式
	AdoNetAppender              將日誌記錄到資料庫中。可以採用SQL和儲存過程兩種方式。
	AnsiColorTerminalAppender   將日誌高亮輸出到ANSI終端。
	AspNetTraceAppender         能用asp.net中Trace的方式檢視記錄的日誌。
	BufferingForwardingAppender 在輸出到子Appenders之前先快取日誌事件。
	ConsoleAppender             將日誌輸出到應用程式控制臺。
	EventLogAppender            將日誌寫到Windows Event Log。
	FileAppender                將日誌輸出到檔案。
	ForwardingAppender          傳送日誌事件到子Appenders。
	LocalSyslogAppender         將日誌寫到local syslog service (僅用於UNIX環境下)。
	MemoryAppender              將日誌存到記憶體緩衝區。
	NetSendAppender             將日誌輸出到Windows Messenger service.這些日誌資訊將在使用者終端的對話方塊中顯示。
	OutputDebugStringAppender   將日誌輸出到Debuger,如果程式沒有Debuger,就輸出到系統Debuger。如果系統Debuger也不可用,將忽略訊息。
	RemoteSyslogAppender        透過UDP網路協議將日誌寫到Remote syslog service。
	RemotingAppender            透過.NET Remoting將日誌寫到遠端接收端。
	RollingFileAppender         將日誌以回滾檔案的形式寫到檔案中。
	SmtpAppender                將日誌寫到郵件中。
	SmtpPickupDirAppender       將訊息以檔案的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或傳送它們。
	TelnetAppender              客戶端透過Telnet來接受日誌事件。
	TraceAppender               將日誌寫到.NET trace 系統。
	UdpAppender                 將日誌以無連線UDP資料包的形式送到遠端宿主或用UdpClient的形式廣播。

2.3 Filter 節點配置詳解

  filter只能作為 appender 的子元素,type 屬性表示 Filter 的型別。常用子元素 param 數量0個或多個,作用設定一些引數。具體例子詳見上文 2.2 Appender 節點配置詳解

  額外補充下 filter 的型別說明:

	DenyAllFilter       阻止所有的日誌事件被記錄
	LevelMatchFilter    只有指定等級的日誌事件才被記錄
	LevelRangeFilter    日誌等級在指定範圍內的事件才被記錄
	LoggerMatchFilter   Logger名稱匹配,才記錄
	PropertyFilter      訊息匹配指定的屬性值時才被記錄
	StringMathFilter    訊息匹配指定的字串才被記錄

2.4 Layout 節點配置詳解

  layout 節點只能作為 appender 的子元素。type 屬性表示 Layout 的型別。具體例子詳見上文 2.2 Appender 節點配置詳解

  額外補充 layout 節點的 type 屬性取值:

	ExceptionLayout         只呈現日誌事件中異常的文字資訊
	PatternLayout           可以透過型別字串來配置的佈局
	RawPropertyLayout       從日誌事件中提取屬性值
	RawTimeStampLayout      從日誌事件中提取日期
	RawUtcTimeStampLayout   從日誌事件中提取UTC日期
	SimpleLayout            很簡單的佈局
	XmlLayout               把日誌事件格式化為XML元素的佈局

  這其中我們主要使用的還是PatternLayout 型別,而在 ConversionPattern 節點中,我們可以進一步的配置日誌輸出格式,以 PatterLayout 的格式化字串輸出為例:

點選檢視 PatterLayout 的格式化字串
    %m、%message         輸出的日誌訊息
    %d、%datetime        輸出當前語句執行的時刻,格式%date{yyyy-MM-dd HH:mm:ss,fff}
    %r、%timestamp       輸出程式從執行到執行到當前語句時消耗的毫秒數
    %p、%level           日誌的當前優先順序別
    %c、%logger          當前日誌物件的名稱
    %L、%line            輸出語句所在的行號
    %F、%file            輸出語句所在的檔名,警告:只在除錯的時候有效,呼叫本地資訊會影響效能
    %a、%appdomain       引發日誌事件的應用程式域的名稱。
    %C、%class、%type    引發日誌請求的類的全名,警告:會影響效能
    %exception           異常資訊
    %u、%identity        當前活動使用者的名字,我測試的時候%identity返回都是空的。警告:會影響效能
    %l、%location        引發日誌事件的名空間、類名、方法、行號。警告:會影響效能,依賴pdb檔案
    %M、%method          發生日誌請求的方法名,警告:會影響效能
    %n、%newline         換行符
    %x、%ndc             NDC(nested diagnostic context)
    %X、%mdc、%P、%properties  等介於 %property
    %property           輸出{log4net:Identity=, log4net:UserName=, log4net:HostName=} 
    %t、%thread         引發日誌事件的執行緒,如果沒有執行緒名就使用執行緒號。
    %w、%username       當前使用者的WindowsIdentity,類似:HostName/Username。警告:會影響效能
    %utcdate            發生日誌事件的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);
                    }
                }
            }
        }
    }
}

  與之對應的,我們的配置檔案也新增以下程式碼:

點選檢視配置檔案新增程式碼
	<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【執行時間】[%r]毫秒
			%n【執行執行緒ID】[%thread]
			%n【執行Log分類的名稱】%logger
			%n【耗材型別名】%Custom{LabTypeName}
			%n【耗材名】%Custom{LabName}
			%n【耗材編號】%Custom{LabNumber}
			%n【是否吸頭】%Custom{IsTip}
			%n【傳入資訊內容/型別】%message
			%n==========" />
		</layout>
	</appender>

  接下來我們新建一個類 LabwareModel,並在幫助類 Log4Helper 中新增呼叫 CustomLog 的方法,來測試能否輸出自定義類 LabwareModel 中的內容。

點選檢視自定義類 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("這是條除錯資訊");
     logCustom.Info("這是條提示資訊");
     logCustom.Warn("這是條警告資訊");
     logCustom.Error(labware);
     logCustom.Fatal("這是條致命錯誤資訊");
 }

  在主程式中呼叫進行測試:

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

  根據上面 FileAppenderCustom 配置中 file 節點中的地址,在專案中會生成 Log 資料夾,該資料夾下會生成類似 CustomLog_2024-07-01.log 的檔案。開啟檔案會看到輸出內容如下:

點選檢視日誌輸出內容
==========           
【日誌級別】DEBUG                  
【記錄時間】2024-07-01 00:18:28,812                  
【執行時間】[37]毫秒           
【執行執行緒ID】[1]           
【執行Log分類的名稱】CustomLog           
【耗材型別名】           
【耗材名】           
【耗材編號】           
【是否吸頭】           
【傳入資訊內容/型別】這是條除錯資訊           
==========
==========           
【日誌級別】INFO                   
【記錄時間】2024-07-01 00:18:28,823                  
【執行時間】[48]毫秒           
【執行執行緒ID】[1]           
【執行Log分類的名稱】CustomLog           
【耗材型別名】           
【耗材名】           
【耗材編號】           
【是否吸頭】           
【傳入資訊內容/型別】這是條提示資訊           
==========
==========           
【日誌級別】WARN                   
【記錄時間】2024-07-01 00:18:28,825                  
【執行時間】[50]毫秒           
【執行執行緒ID】[1]           
【執行Log分類的名稱】CustomLog           
【耗材型別名】           
【耗材名】           
【耗材編號】           
【是否吸頭】           
【傳入資訊內容/型別】這是條警告資訊           
==========
==========           
【日誌級別】ERROR                  
【記錄時間】2024-07-01 00:18:28,826                  
【執行時間】[51]毫秒           
【執行執行緒ID】[1]           
【執行Log分類的名稱】CustomLog           
【耗材型別名】取樣管           
【耗材名】Custom_2000ul           
【耗材編號】200           
【是否吸頭】1           
【傳入資訊內容/型別】WPFPractice.LabwareModel           
==========
==========           
【日誌級別】FATAL                  
【記錄時間】2024-07-01 00:18:28,828                  
【執行時間】[53]毫秒           
【執行執行緒ID】[1]           
【執行Log分類的名稱】CustomLog           
【耗材型別名】           
【耗材名】           
【耗材編號】           
【是否吸頭】           
【傳入資訊內容/型別】這是條致命錯誤資訊           
==========

  以上就是關於 Log4Net 配置詳解。

相關文章