一、前言
在上一篇文章【(轉(zhuǎn)載)非常完善的Log4net配置詳細(xì)說明
<https://www.cnblogs.com/snailblog/p/11484027.html>
】介紹了Log4Net的配置說明,如果不知道的可以去看看,這里我們就介紹一下日志記錄的實(shí)現(xiàn),說得都比較基礎(chǔ),所以大神請繞過。
二、Log4Net實(shí)現(xiàn)
前面介紹了了Log4Net的配置,這里我在把我用的額Log4Net 的配置信息展示出來
<log4net debug="false"> <root> <level value="ALL" /> </root> <logger name=
"PFTLog"> <level value="DEBUG"/> <appender-ref ref="ErrorRollingFileAppender" />
<appender-ref ref="DebugRollingFileAppender" /> <appender-ref ref=
"InfoRollingFileAppender" /> </logger> <!--數(shù)據(jù)日志--> <appender name=
"InfoRollingFileAppender" type="log4net.Appender.RollingFileAppender" > <file
value="LogFile\Info\" /> <appendToFile value="true" />
<!--記錄日志寫入文件時,不鎖定文本文件,防止多線程時不能寫Log,官方說線程非安全--> <lockingModel type=
"log4net.Appender.FileAppender+MinimalLock" /> <Encoding value="UTF-8" />
<!--最多產(chǎn)生的日志文件數(shù),超過則只保留最新的n個。設(shè)定值value="-1"為不限文件數(shù)--> <MaxSizeRollBackups value="20"
/> <!--是否只寫到一個文件中--> <StaticLogFileName value="false" />
<!--按照何種方式產(chǎn)生多個日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value=
"Composite" /> <!--按日期產(chǎn)生文件夾和文件名[在日期方式與混合方式下使用]--> <!--這是按日期產(chǎn)生文件夾,并在文件名前也加上日期-->
<datePattern value="yyyyMMdd-"-Info.log"" /> <!--每個文件的大小。
只在混合方式與文件大小方式下使用。 超出大小后在所有文件名后自動增加正整數(shù)重新命名,數(shù)字最大的最早寫入??捎玫膯挝?KB|MB|GB。
不要使用小數(shù),否則會一直寫入當(dāng)前日志--> <maximumFileSize value="1MB" /> <!--計(jì)數(shù)類型為1,2,3…-->
<!--<CountDirection value="1" />-->
<!--記錄的格式。一般用log4net.Layout.PatternLayout布局--> <layout type=
"log4net.Layout.PatternLayout"> <conversionPattern value="%n記錄時間:%date
%n線程ID[%thread] %n日志級別:%-5level %n記錄類:%logger %n擴(kuò)展信息:%property -%n異常:%exception
%n錯誤描述:%message%newline" /> </layout> <filter type=
"log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param
name="LevelMax" value="INFO" /> </filter> </appender> <!--錯誤日志--> <appender name
="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender" > <file
value="LogFile\Error\" /> <appendToFile value="true" />
<!--記錄日志寫入文件時,不鎖定文本文件,防止多線程時不能寫Log,官方說線程非安全--> <lockingModel type=
"log4net.Appender.FileAppender+MinimalLock" /> <Encoding value="UTF-8" />
<!--最多產(chǎn)生的日志文件數(shù),超過則只保留最新的n個。設(shè)定值value="-1"為不限文件數(shù)--> <MaxSizeRollBackups value="20"
/> <!--是否只寫到一個文件中--> <StaticLogFileName value="false" />
<!--按照何種方式產(chǎn)生多個日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value=
"Composite" /> <!--按日期產(chǎn)生文件夾和文件名[在日期方式與混合方式下使用]--> <!--這是按日期產(chǎn)生文件夾,并在文件名前也加上日期-->
<datePattern value="yyyyMMdd"-Error.log"" /> <!--每個文件的大小。
只在混合方式與文件大小方式下使用。 超出大小后在所有文件名后自動增加正整數(shù)重新命名,數(shù)字最大的最早寫入??捎玫膯挝?KB|MB|GB。
不要使用小數(shù),否則會一直寫入當(dāng)前日志--> <maximumFileSize value="1MB" /> <!--計(jì)數(shù)類型為1,2,3…-->
<!--<CountDirection value="1" />-->
<!--記錄的格式。一般用log4net.Layout.PatternLayout布局--> <layout type=
"log4net.Layout.PatternLayout"> <conversionPattern value="%n記錄時間:%date
%n線程ID[%thread] %n日志級別:%-5level %n記錄類:%logger %n擴(kuò)展信息:%property -%n異常:%exception
%n錯誤描述:%message%newline" /> </layout> <filter type=
"log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <
param name="LevelMax" value="ERROR" /> </filter> </appender> <!--調(diào)試日志--> <
appender name="DebugRollingFileAppender" type=
"log4net.Appender.RollingFileAppender" > <file value="LogFile\Debug\" /> <
appendToFile value="true" /> <!--記錄日志寫入文件時,不鎖定文本文件,防止多線程時不能寫Log,官方說線程非安全--> <
lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <Encoding value
="UTF-8" /> <!--最多產(chǎn)生的日志文件數(shù),超過則只保留最新的n個。設(shè)定值value="-1"為不限文件數(shù)--> <
MaxSizeRollBackups value="20" /> <!--是否只寫到一個文件中--> <StaticLogFileName value=
"false" /> <!--按照何種方式產(chǎn)生多個日志文件(日期[Date],文件大小[Size],混合[Composite])--> <
rollingStyle value="Composite" /> <!--按日期產(chǎn)生文件夾和文件名[在日期方式與混合方式下使用]-->
<!--這是按日期產(chǎn)生文件夾,并在文件名前也加上日期--> <datePattern value=
"yyyyMMdd"-Debug.log"" /> <!--每個文件的大小。 只在混合方式與文件大小方式下使用。
超出大小后在所有文件名后自動增加正整數(shù)重新命名,數(shù)字最大的最早寫入??捎玫膯挝?KB|MB|GB。 不要使用小數(shù),否則會一直寫入當(dāng)前日志--> <
maximumFileSize value="1MB" /> <!--計(jì)數(shù)類型為1,2,3…--> <!--<CountDirection value="1"
/>--> <!--記錄的格式。一般用log4net.Layout.PatternLayout布局--> <layout type=
"log4net.Layout.PatternLayout"> <conversionPattern value="%n記錄時間:%date
%n線程ID[%thread] %n日志級別:%-5level %n記錄類:%logger %n擴(kuò)展信息:%property -%n異常:%exception
%n錯誤描述:%message%newline" /> </layout> <filter type=
"log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <
param name="LevelMax" value="DEBUG" /> </filter> </appender> </log4net> View
Code
里面配置了3個日志的等級(ERROR,DEBUG和INFO),根據(jù)日志的不同等級,記錄到對應(yīng)的文件里面。
下面是具體的實(shí)現(xiàn)代碼
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config",
ConfigFileExtension = "config", Watch = true)] namespace PFT.Standard { public
class PFTLog { private static ILog log =
LogManager.GetLogger(Assembly.GetCallingAssembly(), "PFTLog"); public static
void Error(string message, Action RegistedProperties) { RegistedProperties();
log.Error(message); }public static void Error(string message, Exception
exception, Action RegistedProperties) { RegistedProperties();
log.Error(message, exception); }public static void Error(Exception exception,
Action RegistedProperties) { RegistedProperties(); log.Error("系統(tǒng)Error信息",
exception); }public static void Debug(string message, Action
RegistedProperties) { RegistedProperties(); log.Debug(message); }public static
void Debug(string message, Exception exception, Action RegistedProperties) {
RegistedProperties(); log.Debug(message, exception); }public static void
Debug(Exception exception, Action RegistedProperties) { RegistedProperties();
log.Debug("系統(tǒng)Debug信息", exception); } public static void Info(string message,
Action RegistedProperties) { RegistedProperties(); log.Info(message); }public
static void Info(string message, Exception exception, Action
RegistedProperties) { RegistedProperties(); log.Debug(message, exception); }
public static void Info(Exception exception, Action RegistedProperties) {
RegistedProperties(); log.Info("系統(tǒng)Info信息", exception); } } }
其中RegistedProperties注冊擴(kuò)展字段。
例如:C#代碼
LogManager.Info("測試擴(kuò)展字段", () => { LogicalThreadContext.Properties["LogType"]
= "擴(kuò)展字段內(nèi)容"; });
info日志文件為
<https://img2018.cnblogs.com/blog/1764554/201909/1764554-20190908094554944-160140577.png>
。
這樣的字段擴(kuò)展,可以保存到數(shù)據(jù)庫,也可以與第三方傳值字段對接,是不是很方便。
三、總結(jié)
Log4Net的基本實(shí)現(xiàn),就先介紹到這里。本來計(jì)劃把與Kibana結(jié)合也一起寫了,結(jié)果發(fā)現(xiàn)Kibana結(jié)合到具體項(xiàng)目例子,才更方便講解。所以接下來,我將開始介紹一些單個的模塊實(shí)現(xiàn),然后在基于這些模塊,搭建一個簡單的項(xiàng)目,然后在基于這個項(xiàng)目,寫一些項(xiàng)目應(yīng)用的文章。
熱門工具 換一換