Log4Net 日志記錄的實現


一、前言

在上一篇文章【(轉載)非常完善的Log4net配置詳細說明】介紹了Log4Net的配置說明,如果不知道的可以去看看,這里我們就介紹一下日志記錄的實現,說得都比較基礎,所以大神請繞過。

二、Log4Net實現

前面介紹了了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>

    <!--數據日志-->
    <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" />
      <!--最多產生的日志文件數,超過則只保留最新的n個。設定值value="-1"為不限文件數-->
      <MaxSizeRollBackups value="20" />
      <!--是否只寫到一個文件中-->
      <StaticLogFileName value="false" />
      <!--按照何種方式產生多個日志文件(日期[Date],文件大小[Size],混合[Composite])-->
      <rollingStyle value="Composite" />
      <!--按日期產生文件夾和文件名[在日期方式與混合方式下使用]-->
      <!--這是按日期產生文件夾,並在文件名前也加上日期-->
      <datePattern value="yyyyMMdd-&quot;-Info.log&quot;" />
      <!--每個文件的大小。
      只在混合方式與文件大小方式下使用。
      超出大小后在所有文件名后自動增加正整數重新命名,數字最大的最早寫入。可用的單位:KB|MB|GB。
      不要使用小數,否則會一直寫入當前日志-->
      <maximumFileSize value="1MB" />
      <!--計數類型為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擴展信息:%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" />
      <!--最多產生的日志文件數,超過則只保留最新的n個。設定值value="-1"為不限文件數-->
      <MaxSizeRollBackups value="20" />
      <!--是否只寫到一個文件中-->
      <StaticLogFileName value="false" />
      <!--按照何種方式產生多個日志文件(日期[Date],文件大小[Size],混合[Composite])-->
      <rollingStyle value="Composite" />
      <!--按日期產生文件夾和文件名[在日期方式與混合方式下使用]-->
      <!--這是按日期產生文件夾,並在文件名前也加上日期-->
      <datePattern value="yyyyMMdd&quot;-Error.log&quot;" />
      <!--每個文件的大小。
      只在混合方式與文件大小方式下使用。
      超出大小后在所有文件名后自動增加正整數重新命名,數字最大的最早寫入。可用的單位:KB|MB|GB。
      不要使用小數,否則會一直寫入當前日志-->
      <maximumFileSize value="1MB" />
      <!--計數類型為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擴展信息:%property
                           -%n異常:%exception %n錯誤描述:%message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="ERROR" />
      </filter>
    </appender>

    <!--調試日志-->
    <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" />
      <!--最多產生的日志文件數,超過則只保留最新的n個。設定值value="-1"為不限文件數-->
      <MaxSizeRollBackups value="20" />
      <!--是否只寫到一個文件中-->
      <StaticLogFileName value="false" />
      <!--按照何種方式產生多個日志文件(日期[Date],文件大小[Size],混合[Composite])-->
      <rollingStyle value="Composite" />
      <!--按日期產生文件夾和文件名[在日期方式與混合方式下使用]-->
      <!--這是按日期產生文件夾,並在文件名前也加上日期-->
      <datePattern value="yyyyMMdd&quot;-Debug.log&quot;" />
      <!--每個文件的大小。
      只在混合方式與文件大小方式下使用。
      超出大小后在所有文件名后自動增加正整數重新命名,數字最大的最早寫入。可用的單位:KB|MB|GB。
      不要使用小數,否則會一直寫入當前日志-->
      <maximumFileSize value="1MB" />
      <!--計數類型為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擴展信息:%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),根據日志的不同等級,記錄到對應的文件里面。

下面是具體的實現代碼

[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("系統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("系統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("系統Info信息", exception);
        }

    }
}

其中RegistedProperties注冊擴展字段。

例如:C#代碼

  LogManager.Info("測試擴展字段", () => {
                LogicalThreadContext.Properties["LogType"] = "擴展字段內容";
            });

info日志文件為image

這樣的字段擴展,可以保存到數據庫,也可以與第三方傳值字段對接,是不是很方便。

三、總結

Log4Net的基本實現,就先介紹到這里。本來計划把與Kibana結合也一起寫了,結果發現Kibana結合到具體項目例子,才更方便講解。所以接下來,我將開始介紹一些單個的模塊實現,然后在基於這些模塊,搭建一個簡單的項目,然后在基於這個項目,寫一些項目應用的文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM