Log4Net 日志配置[附帶源碼]


前述

  園子里有許多人對log4net這款開源的日志記錄控件有很多介紹。在這里個人再做一次總結,希望對以后有所幫助,需要的時候可以直接使用,減少查閱資料的時間。利用log4net可以方便地將日志信息記錄到文件、控制台、Windows事件日志和數據庫,並且我們還可以記載控制要記載的日志級別,可以記載的日志類別包括:FATAL(致命錯誤)、ERROR(一般錯誤)、WARN(警告)、INFO(一般信息)、DEBUG(調試信息)。log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫), Appender(附着器)以及 Layout(布局).

准備工作:

1.下載log4net.dll 下載地址[http://logging.apache.org/log4net/download_log4net.cgi]

下載文件:log4net-1.2.13-bin-newkey.zip。 解壓選擇對應的net版本找到log4net.dll。

 2.在項目中引用log4net.dll。

實例代碼

准備工作完成后我們來看下實例代碼 ,首先在項目中創建一個文件夾LogConfig。把有關log4net的一些配置文件和類都放在這個文件夾里面。

WEB網站為例,在項目LogConfig文件夾中創建Log4Net.config配置文件。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!--添加自定義節點:log4net  type:解析類名,程序集名(log4net.dll)-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <!--定義輸出到文件中-->
    <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
      <!--定義文件存放位置-->
      <file value="C:/log4net/"/>
      <!--是否追加到文件,默認為true,通常無需設置-->
      <appendToFile value="true"/>
      <RollingStyle value="Date"/>
      <!--日期的格式,每天換一個文件記錄,如不設置則永遠只記錄一天的日志,需設置-->
      <DatePattern value="INFO_yyyyMMdd&quot;.log&quot;" />
      <!--日志文件名是否為靜態-->
      <StaticLogFileName value="false"/>
      <!--多線程時采用最小鎖定-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <!--布局(向用戶顯示最后經過格式化的輸出信息)-->
      <layout type="log4net.Layout.PatternLayout">
        <!--
           %m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息 
           %n(new line):換行 
           %d(datetime):輸出當前語句運行的時刻 
           %r(run time):輸出程序從運行到執行到當前語句時消耗的毫秒數 
           %t(thread id):當前語句所在的線程ID 
           %p(priority): 日志的當前優先級別,即DEBUG、INFO、WARN…等 
           %c(class):當前日志對象的名稱,例如:
           %L:輸出語句所在的行號 
           %F:輸出語句所在的文件名 
           %-數字:表示該項的最小長度,如果不夠,則用空格填充
          -->
        <Header value="[Header]&#13;&#10;"/>
        <Footer value="[Footer]&#13;&#10;"/>
        <!--正文-->
        <ConversionPattern value="記錄時間:%date 線程ID:[%thread] 日志級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline"  />
      </layout>
    </appender>

    <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender">
      <file value="C:/log4net/"/>
      <appendToFile value="true"/>
      <RollingStyle value="Date"/>
      <DatePattern value="ERROR_yyyyMMdd&quot;.log&quot;" />
      <StaticLogFileName value="false"/>
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <Header value="[Header]&#13;&#10;"/>
        <Footer value="[Footer]&#13;&#10;"/>
        <!--正文-->
        <ConversionPattern value="記錄時間:%date 線程ID:[%thread] 日志級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline"  />
      </layout>
    </appender>

    <root>
      <level value="DEBUG"/>
      <appender-ref ref="Log4Net_ERROR" />

      <level value="INFO"/>
      <appender-ref ref="Log4Net_INFO" />
    </root>

  </log4net>

</configuration>
View Code  

配置文件寫完后我們在來寫一個Helper類。同樣在項目中創建一個名為LogHelper.cs的類文件。

using log4net;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

//指定log4net使用的config文件來讀取配置信息
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"LogConfig\Log4Net.config", Watch = true)]
namespace Project.Log4.Net.LogConfig
{
    /// <summary>
    /// 日志幫助類
    /// </summary>
    public class LogHelper
    {
        private static readonly ConcurrentDictionary<Type, ILog> _loggers = new ConcurrentDictionary<Type, ILog>();

        /// <summary>
        /// 獲取記錄器
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        private static ILog GetLogger(Type source)
        {
            if (_loggers.ContainsKey(source))
            {
                return _loggers[source];
            }
            else
            {
                ILog logger = LogManager.GetLogger(source);
                _loggers.TryAdd(source, logger);
                return logger;
            }
        }

        /* Log a message object */

        /// <summary>
        /// 調試信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Debug(object source, string message)
        {
            Debug(source.GetType(), message);
        }

        /// <summary>
        /// 調試信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="ps"></param>
        public static void Debug(object source, string message, params object[] ps)
        {
            Debug(source.GetType(), string.Format(message, ps));
        }

        /// <summary>
        /// 調試信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Debug(Type source, string message)
        {
            ILog logger = GetLogger(source);
            if (logger.IsDebugEnabled)
                logger.Debug(message);
        }

        /// <summary>
        /// 關鍵信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Info(object source, object message)
        {
            Info(source.GetType(), message);
        }

        /// <summary>
        /// 關鍵信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Info(Type source, object message)
        {
            ILog logger = GetLogger(source);
            if (logger.IsInfoEnabled)
                logger.Info(message);
        }

        /// <summary>
        /// 警告信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Warn(object source, object message)
        {
            Warn(source.GetType(), message);
        }

        /// <summary>
        /// 警告信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Warn(Type source, object message)
        {
            ILog logger = GetLogger(source);
            if (logger.IsWarnEnabled)
                logger.Warn(message);
        }

        /// <summary>
        /// 錯誤信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Error(object source, object message)
        {
            Error(source.GetType(), message);
        }

        /// <summary>
        /// 錯誤信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Error(Type source, object message)
        {
            ILog logger = GetLogger(source);
            if (logger.IsErrorEnabled)
                logger.Error(message);
        }

        /// <summary>
        /// 失敗信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Fatal(object source, object message)
        {
            Fatal(source.GetType(), message);
        }

        /// <summary>
        /// 失敗信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Fatal(Type source, object message)
        {
            ILog logger = GetLogger(source);
            if (logger.IsFatalEnabled)
                logger.Fatal(message);
        }

        /* Log a message object and exception */

        /// <summary>
        /// 調試信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Debug(object source, object message, Exception exception)
        {
            Debug(source.GetType(), message, exception);
        }

        /// <summary>
        /// 調試信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Debug(Type source, object message, Exception exception)
        {
            GetLogger(source).Debug(message, exception);
        }

        /// <summary>
        /// 關鍵信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Info(object source, object message, Exception exception)
        {
            Info(source.GetType(), message, exception);
        }

        /// <summary>
        /// 關鍵信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Info(Type source, object message, Exception exception)
        {
            GetLogger(source).Info(message, exception);
        }

        /// <summary>
        /// 警告信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Warn(object source, object message, Exception exception)
        {
            Warn(source.GetType(), message, exception);
        }

        /// <summary>
        /// 警告信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Warn(Type source, object message, Exception exception)
        {
            GetLogger(source).Warn(message, exception);
        }

        /// <summary>
        /// 錯誤信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Error(object source, object message, Exception exception)
        {
            Error(source.GetType(), message, exception);
        }

        /// <summary>
        /// 錯誤信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Error(Type source, object message, Exception exception)
        {
            GetLogger(source).Error(message, exception);
        }

        /// <summary>
        /// 失敗信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Fatal(object source, object message, Exception exception)
        {
            Fatal(source.GetType(), message, exception);
        }

        /// <summary>
        /// 失敗信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Fatal(Type source, object message, Exception exception)
        {
            GetLogger(source).Fatal(message, exception);
        }
    }

}
View Code  

配置和Helper類都有了..現在來看看調用方法。在項目中創建一個index.aspx頁面

LogHelper.Debug(this, "Debug");
LogHelper.Error(this, "Error");
LogHelper.Fatal(this, "Fatal");
LogHelper.Info(this, "Info");
LogHelper.Warn(this, "Warn");
View Code
 
日志生成格式[每天一個文件]:
 
 

參數說明

Log4Net.config是配置日志輸出參數文件。在這個文件中可以到看很多配置節點,大體可以分為二個大類<configSections>...</configSections> 和 <log4net>...</log4net>。我們來看看這些節點都是啥意思。

1:<configSections>..</configSections>:申明自定義節點log4net解析的類名和程序集名(log4net.dll)。

2:<log4net>..</log4net>:使用log4net的配置信息都在這里設置。來重點看看都有那些設置信息,這個大節點整體也可以分為二類。

2.1:定義輸出信息設置節點<appender></appender>。

2.2:定義日志的輸出媒介<root></root>。

配置的總體結構就是這樣,下面來看一些詳細內容。

 

appender:決定日志輸出的方式(可設置多個節點,如對INFO,ERROR等設置不同的輸出方式)。

主要包括已下幾種:

1 AnsiColorTerminalAppender:在ANSI 窗口終端寫下高亮度的日志事件。
2 AspNetTraceAppender:能用asp.net中Trace的方式查看記錄的日志。
3 BufferingForwardingAppender:在輸出到子Appenders之前先緩存日志事件。
4 ConsoleAppender:將日志輸出到控制台。
5 EventLogAppender:將日志寫到Windows Event Log.
6 FileAppender:將日志寫到文件中。
7 LocalSyslogAppender:將日志寫到local syslog service (僅用於UNIX環境下).
8 MemoryAppender:將日志存到內存緩沖區。
9 NetSendAppender:將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示。
10 RemoteSyslogAppender:通過UDP網絡協議將日志寫到Remote syslog service。
11 RemotingAppender:通過.NET Remoting將日志寫到遠程接收端。
12 RollingFileAppender:將日志以回滾文件的形式寫到文件中。(實例代碼中使用的是此類型)
13 SmtpAppender:將日志寫到郵件中。
14 TraceAppender:將日志寫到.NET trace 系統。
15 UdpAppender:將日志connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。

從上面提供的方式中可以看出能輸出文件、控制台、Windows事件日志和數據庫。這個可根據實際情況選擇。

<appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
...
</appender>

這里配置的name(“Log4Net_INFO”)會在定義日志的輸出媒介中使用到。name可任意設置。

在appender 節點中還會配置一些文件存放的地址,日志個數等信息。這些在實例代碼中都在體現,這里不做說明。我們在來看看日志最后輸出呈現的布局設置信息。

<layout type="log4net.Layout.PatternLayout">
  <!--頭-->
  <Header value="[Header]"/>
  <!--腳注-->
  <Footer value="[Footer]"/>
  <!--正文-->
  <ConversionPattern value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>

 這里配置的信息最終是日志打印出來的樣式。我們可以看到這里可以設置內容頭Header和尾Footer。正文ConversionPattern。在正文中有出現有 %d  [%t]這些都是啥意思了表示什么。這里有一個對照表可提供參考:

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

配置的基本也就這些。下就是root的配置說明 。

root

對設置輸出的方式進行指定。

<root>
  <!--批定DEBUG輸出的文件形式記錄日志-->
  <level value="DEBUG"/>
  <appender-ref ref="Log4Net_ERROR" />

  <!--批定INFO輸出的文件形式記錄日志-->
  <level value="INFO"/>
  <appender-ref ref="Log4Net_INFO" />
</root>

控制級別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定義級別為INFO,則INFO級別向下的級別,比如DEBUG日志將不會被記錄
如果沒有定義LEVEL的值,則缺省為DEBUG

 

附帶源碼:代碼

 


免責聲明!

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



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