Log4Net 日誌記錄的實現

1、前言

在上一篇文章【(轉載)很是完善的Log4net配置詳細說明】介紹了Log4Net的配置說明,若是不知道的能夠去看看,這裏咱們就介紹一下日誌記錄的實現,說得都比較基礎,因此大神請繞過。html

2、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註冊擴展字段。app

例如:C#代碼ide

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

info日誌文件爲image佈局

這樣的字段擴展,能夠保存到數據庫,也能夠與第三方傳值字段對接,是否是很方便。測試

3、總結

Log4Net的基本實現,就先介紹到這裏。原本計劃把與Kibana結合也一塊兒寫了,結果發現Kibana結合到具體項目例子,才更方便講解。因此接下來,我將開始介紹一些單個的模塊實現,而後在基於這些模塊,搭建一個簡單的項目,而後在基於這個項目,寫一些項目應用的文章。spa

相關文章
相關標籤/搜索