C# Log4net配置檔案 總結

櫻花落舞發表於2022-12-17

前言

因為專案日誌太雜亂而且很大,開啟一個就卡死了,何況使用者電腦也扛不住日誌積累,要做一個日誌記錄器管理日誌。但對裡面的配置有一些不熟悉(畢竟都是複製貼上的),所以記錄一下各個項的作用。方便後續複習。

1.0 使用配置檔案

眾所周知,如果要使用一個配置檔案,則需要宣告: [assembly: log4net.Config.XmlConfigurator(Watch = true)]

可以放在 AssemblyInfo.cs檔案中,也可以放在程式碼內,如下程式碼目的是把日誌輸出到控制檯上。

using log4net;
using System;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            ILog log = log4net.LogManager.GetLogger("Test");
            log.Error("錯誤", new Exception("發生了一個異常"));//錯誤
            log.Fatal("嚴重錯誤", new Exception("發生了一個致命錯誤"));//嚴重錯誤
            log.Info("資訊"); //記錄一般資訊
            log.Debug("除錯資訊");//記錄除錯資訊
            log.Warn("警告");//記錄警告資訊
            Console.WriteLine("日誌記錄完畢。");
            Console.Read();
        }
    }
}

其中配置檔案放在 App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>
  <log4net>
    <appender name="控制檯輸出" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"  />
      </layout>
    </appender>
    <logger name="Test">
      <level value="ALL"/>
      <appender-ref ref="控制檯輸出" />
    </logger>
  </log4net>

  <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
</configuration>

在很多demo上,也有 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)],實際上都是差不多,意思是 使用一個叫 log4net.config,字尾名為 config配置檔案。

2 配置檔案內容介紹

2.1 logger.level

透過上面簡單的配置檔案,可以發現是透過一個叫 <logger name="Test">來控制的。那麼可以透過如下程式碼找到它。這個 ILog就提供了一堆方法(Error,Info...)讓我們使用。

ILog log = log4net.LogManager.GetLogger("Test");

<logger name="Test">內部還有一個 <level value="ALL"/>,就是日誌的記錄等級 由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF,那麼這個ALL就是什麼都輸出。如果把等級改為 WARN。那麼上面程式碼輸出如下,很明顯,DEBUG|INFO已經失效了。

C# Log4net配置檔案 總結

2.1 logger.appender

上文給出的demo是針對控制檯輸出的,那麼它是怎麼控制的呢。這個時候就需要  <appender-ref ref="控制檯輸出" />和它名字下的一起控制了

<appender name="控制檯輸出" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"  />
    </layout>
</appender>

其中type還有很多型別。這裡就說幾個常用的。

ConsoleAppender在控制檯寫日誌

ColoredConsoleAppender 額,名字有點直白,就是控制檯輸出的還有顏色

FileAppender往檔案裡面寫日誌

RollingFileAppender基於FileAppender,不過它可以管理檔案大小之類的。

具體的例子我們以後再看。

2.2 logger.layout

到這裡就是控制記錄格式了。其中常用的是 <layout type="log4net.Layout.PatternLayout">,透過識別符號來控制格式,以下是一些解釋

%m(message):輸出的日誌訊息,如ILog.Debug(…)輸出的一條訊息

%n(new line):換行

%d(datetime):輸出當前語句執行的時刻

%r(run time):輸出程式從執行到執行到當前語句時消耗的毫秒數

%t(thread id):當前語句所在的執行緒ID

%p(priority): 日誌的當前優先順序別,即DEBUG、INFO、WARN…等

%c(class):當前日誌物件的名稱

2.3 logger.filter

接下來,我們來點複雜的配置 <filter type="log4net.Filter.LevelRangeFilter">,為了避免看走神,我們把配置檔案再展示一次。加入這個類似於過濾,意思是隻有等級區間內INFO|WARN|ERROR的才可以輸出。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>
  <log4net>
    <appender name="控制檯輸出" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"  />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
	    <param name="LevelMin" value="INFO" />
	    <param name="LevelMax" value="ERROR" />
      </filter>
    </appender>
    <logger name="Test">
      <level value="ALL"/>
      <appender-ref ref="控制檯輸出" />
    </logger>
  </log4net>

  <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
</configuration>

2.4 root

可以把它看做是根logger,如果沒有顯示定義logger,那麼使用根日誌定義的屬性。

<root>
    <level value="ALL" />
    <appender-ref ref="控制檯輸出" />
</root>

2.4 綜合使用

現在已經瞭解基礎配置了,快來試一試複雜的配置吧

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>
  <log4net>
	  <appender name="SysAppender" type="log4net.Appender.RollingFileAppender">
		  <!--日誌路徑-->
		  <File value="Log\\"/>
		  <!--是否是向檔案中追加日誌-->
		  <AppendToFile value="true"/>
		  <!--建立新檔案的方式-->
		  <param name="RollingStyle" value="Date"/>
		  <!--日誌檔名-->
		  <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;"/>
		  <!--log檔案大小-->
		  <MaximumFileSize value="1024"/>
		  <!--備份日誌數目-->
		  <MaxSizeRollBackups value="30"/>
		  <!--日誌檔名是否是固定不變的-->
		  <StaticLogFileName value="false"/>
		  <!--記錄日誌寫入檔案時,不鎖定文字檔案,防止多執行緒時不能寫Log,官方說執行緒非安全-->
		  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		  <!--輸出格式-->
		  <layout type="log4net.Layout.PatternLayout">
			  <!--日期 [級別]-->
			  <conversionPattern value="%d [%-5p] [%t%] -%m%n"/>
		  </layout>
		  <!--控制器,只記錄級別在INFO-INFO之間的資訊-->
		  <filter type="log4net.Filter.LevelRangeFilter">
			  <param name="LevelMin" value="ALL" />
			  <param name="LevelMax" value="OFF" />
		  </filter>
	  </appender>
    <logger name="Test">
	    <level value="ALL"/>
        <appender-ref ref="SysAppender"/>
    </logger>
  </log4net>

  <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
    </startup>
</configuration>

3.0 透過程式碼獲取配置資訊

除了 log4net.LogManager.GetLogger("Test");還有一種可以獲取以上配置資訊 Repository

using System;

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            log4net.Repository.Hierarchy.Hierarchy hier =
                (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository();

            var logs = hier.GetCurrentLoggers();

            //輸出logger名稱
            foreach (var logger in logs)
            {
                Console.WriteLine(logger.Name);
            }

            //輸出appenders名稱
            var appenders = hier.GetAppenders();
            foreach (var appender in appenders)
            {
                Console.WriteLine(appender.Name);
            }

            Console.Read();
        }
    }
}

參考連結

log4net文件

C# log4net 配置

C#中log4net使用方法(一)

log4net面面觀之工作原理

log4net面面觀之Repository

 

相關文章