前言
Common.Logging 是Commons-Logging(apache最早提供的日志門面接口,提供了簡單的日志實現以及日志解耦功能) 項目的.net版本。其目的是為 "所有的.net日志實現"提供一個統一的接口,在系統的迭代過程中,可靈活的切換不同的日志實現組件(Log4Net、NLog、EntLib等)。
原理
Common.Logging.LogManager類 作為操作日志實例的主接口,提供了3個對外的方法來獲取日志實例


如何集成至項目
Common.logging結合Log4Net如何集成至項目中實現日志管理?
選擇安裝的版本
查看Log4Net的官方版本發布記錄發現,從1.2.11版本開始支持的.NET 3.5 和 .NET 4.0, 從2.0.6版本(17年5月)開始支持.NET Core 和 .NET Standard 1.3。那么我們選擇的Log4Net版本,至少得是1.2.11版本。 而適配Common.Logging的Log4Net插件版本也有很多(主要是不同版本的Log4Net進行適配),我選擇的是Common.Logging.Log4Net1211.
在項目中最好是使用Nuget安裝包,會自動關聯其Log4Net的版本
先安裝 Common.Logging
Install-Package Common.Logging -Version 3.3.1
再安裝Common.Logging.Log4Net1211
Install-Package Common.Logging.Log4Net1211 -Version 3.3.1
web.config的配置
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
</configSections>
<common>
<!--[DEBUG < INFO < WARN < ERROR < FATAL]-->
<logging>
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1211">
<!--表示log4net的配置直接寫在配置文件里-->
<!--<arg key="configType" value="INLINE"/>-->
<!--log4net使用獨立的配置文件-->
<arg key="configType" value="FILE-WATCH" />
<arg key="configFile" value="~/XmlConfig/log4net.config" />
</factoryAdapter>
</logging>
</common>
</configuration>
log4net的配置
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--目錄路徑,可以是相對路徑或絕對路徑-->
<file value="Log/" />
<!--日期的格式,每天換一個文件記錄,如不設置則永遠只記錄一天的日志,需設置-->
<datePattern value='yyyy-MM-dd/"info.log"' />
<!--追加到文件-->
<appendToFile value="true" />
<!--創建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite" />
<!--寫到一個文件-->
<staticLogFileName value="false" />
<!--單個文件大小。單位:KB|MB|GB-->
<maximumFileSize value="200MB" />
<!--最多保留的文件數,設為"-1"則不限-->
<maxSizeRollBackups value="-1" />
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender>
<appender name="TraceRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--目錄路徑,可以是相對路徑或絕對路徑-->
<file value="Log/" />
<!--日期的格式,每天換一個文件記錄,如不設置則永遠只記錄一天的日志,需設置-->
<datePattern value='yyyy-MM-dd/"trace.log"' />
<!--追加到文件-->
<appendToFile value="true" />
<!--創建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite" />
<!--寫到一個文件-->
<staticLogFileName value="false" />
<!--單個文件大小。單位:KB|MB|GB-->
<maximumFileSize value="200MB" />
<!--最多保留的文件數,設為"-1"則不限-->
<maxSizeRollBackups value="-1" />
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender>
<appender name="WarnRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--目錄路徑,可以是相對路徑或絕對路徑-->
<file value="Log/" />
<!--日期的格式,每天換一個文件記錄,如不設置則永遠只記錄一天的日志,需設置-->
<datePattern value='yyyy-MM-dd/"warn.log"' />
<!--追加到文件-->
<appendToFile value="true" />
<!--創建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite" />
<!--寫到一個文件-->
<staticLogFileName value="false" />
<!--單個文件大小。單位:KB|MB|GB-->
<maximumFileSize value="200MB" />
<!--最多保留的文件數,設為"-1"則不限-->
<maxSizeRollBackups value="-1" />
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender>
<appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--目錄路徑,可以是相對路徑或絕對路徑-->
<file value="Log/" />
<!--日期的格式,每天換一個文件記錄,如不設置則永遠只記錄一天的日志,需設置-->
<datePattern value='yyyy-MM-dd/"error.log"' />
<!--追加到文件-->
<appendToFile value="true" />
<!--創建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite" />
<!--寫到一個文件-->
<staticLogFileName value="false" />
<!--單個文件大小。單位:KB|MB|GB-->
<maximumFileSize value="200MB" />
<!--最多保留的文件數,設為"-1"則不限-->
<maxSizeRollBackups value="-1" />
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender>
<root>
<appender-ref ref="RollingFileAppender" />
<!--控制級別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定義級別為INFO,則INFO級別向下的級別,比如DEBUG日志將不會被記錄
如果沒有定義LEVEL的值,則缺省為DEBUG-->
<level value="INFO" />
</root>
<!--TraceLog 名稱固定,寫入調試跟蹤日志-->
<logger name="TraceLog" additivity="false">
<appender-ref ref="TraceRollingFileAppender" />
<level value="INFO" />
</logger>
<!--Warnlog 名稱固定,寫入警告日志-->
<logger name="WarnLog" additivity="false">
<appender-ref ref="WarnRollingFileAppender" />
<level value="WARN" />
</logger>
<!--Errorlog 名稱固定,寫入異常錯誤日志-->
<logger name="ErrorLog" additivity="false">
<appender-ref ref="ErrorRollingFileAppender" />
<level value="ERROR" />
</logger>
</log4net>
更多參數配置說明,請移步Log4Net官網。
應用案例
在實際的項目中,我們還封裝了LogHelper類用來獲取定義好的日志實例(ErrorLog、WarnLog、TraceLog),具體使用如下:
LogHelper.Trace("log222");
LogHelper.Warn("log222");
LogHelper.Error(new Exception('出錯了'));
有關LogHelper的源代碼,以及測試demo,我已整理放至github上https://github.com/yinboxie/BlogExampleDemo
參考
1、使用Common.Logging+log4net規范日志管理
2、Common.Logging源碼解析
3、Log4net配置與使用簡要說明
4、非常完善的Log4net詳細說明