Log4net


一、Log4net簡介

  日志記錄往往是軟件開發周期中的重要組成部分。它具有以下幾個優點:它可以提供應用程序運行時的精確環境,可供開發人員盡快找到應用程序中的Bug;一旦在程序中加入了Log 輸出代碼,程序運行過程中就能生成並輸出日志信息而無需人工干預。

  Log4net是一個非常不錯的日志組件,使用方式也很簡單,只需要通過配置就能夠方便使用。

二、輸出日志到文本文件

  輸出日志到文本文件非常簡單。

  1、配置文件的操作,增加一個配置節

  <configSections>
    <!--添加一個自定義log4net節點組-->
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>

  2、配置內容

  <log4net>
    <!--定義輸出到文件中-->
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <!--定義文件存放位置-->
      <file value="D:\123.txt" />
      <!--是否追加到文件-->
      <appendToFile value="true" />
      <!--變換的形式為日期-->
      <rollingStyle value="Date" />
      <!--日期的格式-->
      <datePattern value="yyyyMMdd-HH:mm:ss" />
      <!--以日志文件大小變換文件名-->
      <rollingStyle value="Size" />
      <!--最大變換數量,-1為不限制-->
      <maxSizeRollBackups value="-1" />
      <!--最大文件大小(1G切換)-->
      <maximumFileSize value="1GB" />
      <layout type="log4net.Layout.PatternLayout">
        <!--每條日志末尾的文字說明-->
        <footer value="by Mr.Jun" />
        <!--輸出格式-->
        <conversionPattern value="記錄時間:%date 線程ID:[%thread] 日志級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" />
      </layout>
    </appender>
    <root>
      <!--文件形式記錄日志(僅僅輸出文件形式)-->
      <appender-ref ref="LogFileAppender" />
    </root>
  </log4net>

  3、命名空間頂部需要增加

    [assembly: log4net.Config.XmlConfigurator(Watch = true)]   

  4、測試代碼

    public ActionResult Index()
    {
        int i = 1 - 1;
        int j = 10;
        int k;
        try
        {
            k = j / i;
        }
        catch(Exception e)
        {
            //創建日志記錄組件實例
            ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
            //記錄錯誤日志
            log.Error("error", e);
        }
        return View();
    }

  4、輸出內容

記錄時間:2014-04-11 14:54:07,680 線程ID:[11] 日志級別:ERROR 出錯類:MvcApplication5.Controllers.HomeController property:[(null)] - 錯誤描述:error
System.DivideByZeroException: 嘗試除以零。
   在 MvcApplication5.Controllers.HomeController.Index() 位置 C:\Users\ChenZhuo\documents\visual studio 2010\Projects\MvcApplication5\MvcApplication5\Controllers\HomeController.cs:行號 25

三、日志輸出到郵件

  此處要實現的功能是,當錯誤級別達到error,則保存日志並發送郵件,當級別低於error時,僅僅保存日志文件。

  增加配置節后,配置內容如下:

  <log4net>
    <!--根據logger獲取ILog對象-->
    <logger name="logger">
      <!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
      <!--如果沒有定義LEVEL的值,則缺省為DEBUG-->
      <level value="ALL" />
      <appender-ref ref="LogSmtpAppender" />
      <appender-ref ref="LogFileAppender" />
    </logger>
    <!--定義輸出到文件中-->
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <!--定義文件存放位置-->
      <file value="D:\123.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd-HH:mm:ss" />
      <layout type="log4net.Layout.PatternLayout">
        <!--輸出格式-->
        <conversionPattern value="記錄時間:%date 線程ID:[%thread] 日志級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" />
      </layout>
    </appender>
    <!--定義郵件發送-->
    <appender name="LogSmtpAppender" type="log4net.Appender.SmtpAppender">
      <authentication value="Basic" />
      <to value="xxx@qq.com" />
      <from value="xxx@163.com" />
      <username value="xxx@163.com" />
      <password value="xxx" />
      <subject value="XXX應用錯誤日志消息" />
      <smtpHost value="smtp.163.com" />
      <bufferSize value="2048" />
      <!--超長部分是否丟棄-->
      <lossy value="true" />
      <!--日志級別 大於 WARN 的才發郵件-->
      <evaluator type="log4net.Core.LevelEvaluator">
        <threshold value="ERROR"/>
      </evaluator>
      <!--定義郵件的格式-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" />
      </layout>
    </appender>
  </log4net>

  命名空間頂部:

    [assembly: log4net.Config.XmlConfigurator(Watch = true)]   

  測試代碼:

    public ActionResult Index()
    {
        int i = 1 - 1;
        int j = 10;
        int k;
        try
        {
            k = j / i;
        }
        catch(Exception e)
        {
            //創建日志記錄組件實例
            ILog log = log4net.LogManager.GetLogger("logger");
            //記錄錯誤日志
            log.Error("error", e);
        }
        return View();
    }

  發送的郵件內容如下:

  

四、更多配置說明

  具體說來有如下Appender:

Appender 說明
AdoNetAppender 利用ADO.NET記錄到數據庫的日志
AnsiColorTerminalAppender 在ANSI 窗口終端寫下高亮度的日志事件
AspNetTraceAppender 能用asp.net中Trace的方式查看記錄的日志
BufferingForwardingAppender 在輸出到子Appenders之前先緩存日志事件
ConsoleAppender 將日志輸出到控制台
EventLogAppender 將日志寫到Windows Event Log
FileAppender 將日志寫到文件中
LocalSyslogAppender 將日志寫到local syslog service
MemoryAppender 將日志存到內存緩沖區
NetSendAppender 將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示
RemoteSyslogAppender 通過UDP網絡協議將日志寫到Remote syslog service
RemotingAppender 通過.NET Remoting將日志寫到遠程接收端
RollingFileAppender 將日志以回滾文件的形式寫到文件中
SmtpAppender 將日志寫到郵件中
TraceAppender 將日志寫到.NET trace 系統
UdpAppender 將日志connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播

  參數說明

參數 說明
%m(message) :輸出的日志消息,如ILog.Debug(…)輸出的一條消息
%n(new line) 換行 
%d(datetime) 輸出當前語句運行的時刻 
%r(run time) 輸出程序從運行到執行到當前語句時消耗的毫秒數
%t(thread id) 當前語句所在的線程ID 
%p(priority) 日志的當前優先級別,即DEBUG、INFO、WARN…等 
%c(class) 當前日志對象的名稱
%f(file) 輸出語句所在的文件名
%l(line) 輸出語句所在的行號
%數字 表示該項的最小長度,如果不夠,則用空格填充

 

五、使用說明

  1、關聯配置文件

  當我們創建了上面的配置文件后,我們接下來需要把它和我們的應用聯系起來。缺省的,每個獨立的可執行程序集都會定義它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的級別上定義配置文件。

  例如:可以在項目的AssemblyInfo.cs文件里添加以下的語句

[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename", ConfigFileExtension="ext",Watch=true/false)]
  • ConfigFile:指出了我們的配置文件的路徑及文件名,包括擴展名。
  • ConfigFileExtension:如果我們對被編譯程序的程序集使用了不同的文件擴展名,那么我們需要定義這個屬性,缺省的,程序集的配置文件擴展名為”config”。
  • Watch (Boolean屬性): log4net框架用這個屬性來確定是否需要在運行時監視文件的改變。如果這個屬性為true,那么FileSystemWatcher將會被用來監視文件的改變,重命名,刪除等事件。

  其中:ConfigFile和ConfigFileExtension屬性不能同時使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt”

  2、創建或獲取日志對象

  日志對象會使用在配置文件里定義的屬性。如果某個日志對象沒有事先在配置文件里定義,那么框架會根據繼承結構獲取祖先節點的屬性,最終的,會從根日志獲取屬性。如下所示:

Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");

  3、輸出日志信息

  可以使用ILog的幾種方法輸出日志信息。你也可以在調用某方法前先檢查IsXXXEnabled布爾變量,再決定是否調用輸出日志信息的函數,這樣可以提高程序的性能。因為框架在調用如ILog.Debug(…)這樣的函數時,也會先判斷是否滿足Level日志級別條件。

if (log.IsDebugEnabled) log.Debug("message");

if (log.IsInfoEnabled) log.Info("message);


免責聲明!

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



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