天天看點

.NET中間件 -- log4netLog4netNuGet安裝配置檔案代碼加載調用輸出 其他說明

目錄

Log4net

NuGet安裝

配置檔案

代碼加載

調用

輸出

其他說明

     Appender

     Filters

     日志等級

     layout節點配置說明

Log4net

Log4net是一個.Net版的開源日志架構,它的功能很強大,可以将日志分為不同的等級,以不同的格式輸出到不同的存儲媒體中,比如:資料庫、txt檔案、記憶體緩沖區、郵件、控制台、ANSI終端、遠端接收端等等。

NuGet安裝

.NET中間件 -- log4netLog4netNuGet安裝配置檔案代碼加載調用輸出 其他說明

配置檔案

 建立配置檔案log4net.config, 在檔案屬性–>複制到輸出目錄->選擇始終複制(将檔案複制到執行目錄下,以便代碼加載)

示例(輸出到控制台和檔案):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!--聲明一個名為“log4net“的自定義配置節-->
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <!--Appenders用來定義日志的輸出方式,即日志要寫到那種媒體上去-->
    <!--控制台Trace Appender -->    <!--ConsoleAppender:将日志輸出到應用程式控制台-->
    <appender name="TraceConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <!--Layout用于控制Appender的輸出格式-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date:%-5level - %message%newline" />
      </layout>
    </appender>
    
    <!--控制台Error Appender -->
    <appender name="ErrorConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date:%-5level - %message%newline" />
      </layout>
    </appender>
    
    <!--檔案Trace Appender -->                <!--RollingFileAppender:将日志以復原檔案的形式寫到檔案中-->              
    <appender name="TraceLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志檔案路徑(相對路徑),   按照日期形式輸出時,直接連接配接元素DatePattern的value形成檔案路徑-->
      <file value="Logs\TraceLogs\Log_"/>
      <!--是否追加到檔案-->
      <appendToFile  value="true"/>
      <!--最多産生的日志檔案數,超過則隻保留最新的n個。設定值value="-1"為不限檔案數-->
      <param name="MaxSizeRollBackups" value="50" />
      <!--是否隻寫到一個檔案中-->
      <StaticLogFileName value="false" />
      <!--按照何種方式産生多個日志檔案(日期[Date],檔案大小[Size],混合[Composite])-->
      <rollingstyle value="Date"/>
      <datePattern value="yyyyMMdd'.txt'"/>
      <!--使用過濾器可以過濾掉Appender輸出的内容,  LevelRangeFilter:日志等級在指定範圍内的事件才被記錄,  架構提供多種過濾器-->
      <filter type="log4net.Filter.LevelRangeFilter">
        <LevelMin value="DEBUG"/>
        <LevelMax value="WARN"/>
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <!--日志起始-->
        <header value="---------------  TRACE LOG START -----------------------&#13;&#10;" />
        <!--日志結尾-->
        <Footer value="---------------- TRACE LOG CLOSE -----------------------&#13;&#10;" />
        <!-- 輸出格式: 發生日志事件的本地時間 :日志等級 - 輸出的消息  換行-->
        <ConversionPattern value="%date:%-5level - %message%newline" />
      </layout>
    </appender>
    
    <!--檔案Error Appender -->
    <appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs\ErrorLogs\Log_" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd'.txt'" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <header value="---------------  ERROR LOG START -----------------------&#13;&#10;" />
        <Footer value="---------------  ERROR LOG CLOSE -----------------------&#13;&#10;" />
        <ConversionPattern value="%date:%-5level - %message%newline" />
      </layout>
    </appender>

    <!--Logger是直接和應用程式互動的元件。Logger隻是産生日志,然後由它引用的Appender記錄到指定的媒介,并由Layout控制輸出格式-->
    <logger name="TraceLog">
      <!--log日志級别: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL-->
      <!--高于等級設定值的方法都能寫入日志。例如當我們設成Info時,logger.Debug就會被忽略而不寫入檔案,但是FATAL,ERROR,WARN,INFO會被寫入,因為他們等級高于INFO。-->
      <level value="ALL"/>
      <!--引用上文定義的appender-->
      <appender-ref ref="TraceLogFileAppender"/>
      <appender-ref ref="TraceConsoleAppender"/>
    </logger>

    <logger name="ErrorLog">
      <level value="WARN"/>
      <appender-ref ref="ErrorConsoleAppender"/>
      <appender-ref ref="ErrorLogFileAppender"/>
    </logger>
    
  </log4net>
</configuration>
           

代碼加載

using System;
using log4net;

//使用配置檔案log4net.config,    Watch=true : 監視配置檔案,當配置檔案發生變化的時候,就會重新加載。
[assembly:log4net.Config.XmlConfigurator(ConfigFile ="log4net.config",Watch =true)]
namespace LoginManagement.Common
{
    public class LogHelper
    {
        //獲得配置檔案中相應的Logger,其中"TraceLog/ErrorLog"便是我們自定義的日志對象<logger>的name的值。
        private static ILog m_TraceLog = LogManager.GetLogger("TraceLog");
        private static ILog m_ErrorLog = LogManager.GetLogger("ErrorLog");

        // ************************************************************************************************************
        // 函數名:TraceIn
        // 輸入參數:
        // className: 類名稱
        // func: 函數名
        // info: 參數資訊
        // 輸出參數:無
        // 傳回值:無
        // 說明:輸出函數輸入資訊
        // ************************************************************************************************************
        public static void TraceIn(string className, string func, string info)
        {
            string msg = string.Format("{0}.{1} <- {2}",className,func,info);
            if (m_TraceLog.IsInfoEnabled)
            {
                m_TraceLog?.Info(msg);
            }
        }

        // ************************************************************************************************************
        // 函數名:TraceOut
        // 輸入參數:
        // className: 類名稱
        // func: 函數名
        // info: 傳回值和輸出參數
        // 輸出參數:無
        // 傳回值:無
        // 說明:輸出函數傳回資訊
        // ************************************************************************************************************
        public static void TraceOut(string className, string func, string info)
        {
            string msg = string.Format("{0}.{1} -> {2}", className, func, info);
            if (m_TraceLog.IsInfoEnabled)
            {
                m_TraceLog?.Info(msg);
            }
            
        }

        // ************************************************************************************************************
        // 函數名:LogError
        // 輸入參數:
        // className: 類名稱
        // func: 函數名
        // info: 報錯資訊
        // 輸出參數:無
        // 傳回值:位元組數組
        // 說明:輸出錯誤資訊
        // ************************************************************************************************************
        public static void LogError(string className, string func, string info)
        {
            string msg = string.Format("{0}.{1} -> {2}", className, func, info);
            if (m_ErrorLog.IsErrorEnabled)
            {
                m_ErrorLog?.Error(msg);
            }
        }

        // ************************************************************************************************************
        // 函數名:LogErrorException
        // 輸入參數:
        // className: 類名稱
        // func: 函數名
        // info: 報錯資訊
        // 輸出參數:無
        // 傳回值:位元組數組
        // 說明:輸出錯誤資訊&異常
        // ************************************************************************************************************
        public static void LogErrorException(string className, string func, string info, Exception ex)
        {
            string msg = string.Format("{0}.{1} -> {2}", className, func, info);
            if (m_ErrorLog.IsErrorEnabled)
            {
                m_ErrorLog?.Error(msg,ex);
            }
        }
    }
}
           

調用

using System.Reflection;
 
private void DoLogin(object o)
        {
            try
            {
                LogHelper.TraceIn(MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name, string.Format("object o:{0}", o));
                if (string.IsNullOrEmpty(LoginModel.UserName))
                {
                    LoginModel.ErrorMessage = "使用者名不能為空";
                    LogHelper.LogError(MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name, "登入失敗,使用者名不能為空");
                    return;
                }

                // ...
                
            }
            catch (Exception ex)
            {
                LogHelper.LogErrorException(MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name, "登入異常" , ex);
            }
            
            
        }
           

輸出

根據log4net.config配置的檔案路徑,生成對應的log檔案夾和檔案

.NET中間件 -- log4netLog4netNuGet安裝配置檔案代碼加載調用輸出 其他說明
.NET中間件 -- log4netLog4netNuGet安裝配置檔案代碼加載調用輸出 其他說明
.NET中間件 -- log4netLog4netNuGet安裝配置檔案代碼加載調用輸出 其他說明

 其他說明

   Appenders

  • AdoNetAppender 将日志記錄到資料庫中。可以采用SQL和存儲過程兩種方式。
  • AnsiColorTerminalAppender 将日志高亮輸出到ANSI終端。
  • AspNetTraceAppender  能用asp.net中Trace的方式檢視記錄的日志。
  • BufferingForwardingAppender 在輸出到子Appenders之前先緩存日志事件。
  • ConsoleAppender 将日志輸出到應用程式控制台。
  • EventLogAppender 将日志寫到Windows Event Log。
  • FileAppender 将日志輸出到檔案。
  • ForwardingAppender 發送日志事件到子Appenders。
  • LocalSyslogAppender 将日志寫到local syslog service (僅用于UNIX環境下)。
  • MemoryAppender 将日志存到記憶體緩沖區。
  • NetSendAppender 将日志輸出到Windows Messenger service.這些日志資訊将在使用者終端的對話框中顯示。
  • OutputDebugStringAppender 将日志輸出到Debuger,如果程式沒有Debuger,就輸出到系統Debuger。如果系統Debuger也不可用,将忽略消息。
  • RemoteSyslogAppender 通過UDP網絡協定将日志寫到Remote syslog service。
  • RemotingAppender 通過.NET Remoting将日志寫到遠端接收端。
  • RollingFileAppender 将日志以復原檔案的形式寫到檔案中。
  • SmtpAppender 将日志寫到郵件中。
  • SmtpPickupDirAppender 将消息以檔案的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發送它們。
  • TelnetAppender 用戶端通過Telnet來接受日志事件。
  • TraceAppender 将日志寫到.NET trace 系統。
  • UdpAppender 将日志以無連接配接UDP資料報的形式送到遠端宿主或用UdpClient的形式廣播。

   Filters

  • DenyAllFilter 阻止所有的日志事件被記錄
  • LevelMatchFilter 隻有指定等級的日志事件才被記錄
  • LevelRangeFilter 日志等級在指定範圍内的事件才被記錄
  • LoggerMatchFilter 與Logger名稱比對,才記錄
  • PropertyFilter 消息比對指定的屬性值時才被記錄
  • StringMathFilter 消息比對指定的字元串才被記錄

   日志等級

  • FATAL(緻命錯誤):記錄系統中出現的能使用系統完全失去功能,服務停止,系統崩潰等使系統無法繼續運作下去的錯誤。例如,資料庫無法連接配接,系統出現死循環。
  • ERROR(一般錯誤):記錄系統中出現的導緻系統不穩定,部分功能出現混亂或部分功能失效一類的錯誤。例如,資料字段為空,資料操作不可完成,操作出現異常等。
  • WARN(警告):記錄系統中不影響系統繼續運作,但不符合系統運作正常條件,有可能引起系統錯誤的資訊。例如,記錄内容為空,資料内容不正确等。
  • INFO(一般資訊):記錄系統運作中應該讓使用者知道的基本資訊。例如,服務開始運作,功能已經開戶等。
  • DEBUG (調試資訊):記錄系統用于調試的一切資訊,内容或者是一些關鍵資料内容的輸出。

   layout節點配置說明

  • %m(message):輸出的日志消息;
  • %n(newline):換行;
  • %d(datetime):輸出目前語句運作的時刻;
  • %r(runtime):輸出程式從運作到執行到目前語句時消耗的毫秒數;
  • %t(threadid):目前語句所在的線程ID ;
  • %p(priority): 日志的目前日志級别;
  • %c(class):目前日志對象的名稱;
  • %L:輸出語句所在的行号;
  • %F:輸出語句所在的檔案名;
  • %-10:表示最小長度為10,如果不夠,則用空格填充

參考:

[1] 非常完善的Log4net詳細說明_芒果兒-CSDN部落格_log4net

[2] log4net配置及使用 - 故人與貓 - 部落格園 (cnblogs.com)