C# Log4net配置文件 總結
前言
因為項目日誌太雜亂而且很大,打開一個就卡死了,何況用戶電腦也扛不住日誌積累,要做一個日誌記錄器管理日誌。但對裡面的配置有一些不熟悉(畢竟都是複製粘貼的),所以記錄一下各個項的作用。方便後續複習。
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
已經失效了。
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".log""/>
<!--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();
}
}
}
參考鏈接