Log4Net的概念和使用

 

第一篇文本日誌

log4net簡介:java

log4net簡介:數據庫

log4net是一個功能著名的開源日誌記錄組件,java平臺而來。apache

利用log4net能夠方便地將日誌信息記錄到文件、控制檯、Windows事件日誌和數據庫(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。緩存

而且咱們還能夠記載控制要記載的日誌級別,能夠記載的日誌類別包括:網絡

1FATAL(致命錯誤)、app

2ERROR(通常錯誤)、less

3WARN(警告)、ide

4INFO(通常信息)、性能

5DEBUG(調試信息)。網站

要想獲取最新版本的log4net組件庫,能夠到官方網站http://logging.apache.org/log4net/下載

 

在程序中咱們只須要log4net.dll文件就好了,添加對log4net.dll的引用,就能夠在程序中使用了。

接着咱們配置相關的配置文件(WinForm對應的是*.exe.configWebForm對應的是*.config),本實例中是控制檯應用程序,配置以下(附各配置的說明):

 

在程序中,咱們建立一個app.config的配置文件,那麼系統會自動將其中的內容複製到了下圖中的 *.exe.config .

 

打開這個文件就能看到一致的內容.

 

config文件中的配置

要使用log4net,首先要在config文件的<configSections>節點中增長配置(若是沒有這個節點請手動增長),以下:

<configSections>  

    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>  

</configSections>  

 

在頂級節點<configuration>下增長<log4net>子節點。在<log4net>節點下就能夠增長<appender>子節點,每一個<appender>子節點表明一種記錄日誌的方式(僅在這裏配置了不表明啓用了)。

具體說來有以下Appender:

 

AdoNetAppender:利用ADO.NET記錄到數據庫的日誌

AnsiColorTerminalAppender:在ANSI 窗口終端寫下高亮度的日誌事件。

AspNetTraceAppender:能用asp.NetTrace的方式查看記錄的日誌。

BufferingForwardingAppender:在輸出到子Appenders以前先緩存日誌事件。

ConsoleAppender:將日誌輸出到控制檯。

EventLogAppender:將日誌寫到Windows Event Log. 

FileAppender:將日誌寫到文件中。

LocalSyslogAppender:將日誌寫到local syslog service (僅用於UNIX環境下). 

MemoryAppender:將日誌存到內存緩衝區。

NetSendAppender:將日誌輸出到Windows Messenger service.這些日誌信息將在用戶終端的對話框中顯示。

RemoteSyslogAppender:經過UDP網絡協議將日誌寫到Remote syslog service

RemotingAppender:經過.NET Remoting將日誌寫到遠程接收端。

RollingFileAppender:將日誌以回滾文件的形式寫到文件中。

SmtpAppender:將日誌寫到郵件中。

TraceAppender:將日誌寫到.NET trace 系統。

UdpAppender:將日誌connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。

 

關於使用log4net中可能會使用到的一些參數

%m(message):輸出的日誌消息,如ILog.Debug(…)輸出的一條消息 

%n(new line):換行 

%d(datetime):輸出當前語句運行的時刻 

%r(run time):輸出程序從運行到執行到當前語句時消耗的毫秒數 

%t(thread id):當前語句所在的線程ID 

%p(priority): 日誌的當前優先級別,即DEBUGINFOWARN… 

%c(class):當前日誌對象的名稱,例如:

%f(file):輸出語句所在的文件名。

%l(line):輸出語句所在的行號

%數字:表示該項的最小長度,若是不夠,則用空格填充,如「%-5level」表示level的最小寬度是5個字符,若是實際長度不夠5個字符則以空格填充。

 

好比在配置中有:

「%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline」

那麼實際的日誌中會是以下格式:

記錄時間:2010-11-17 16:16:36,561 線程ID:[9] 日誌級別:文件:所在行ERROR 出錯類:Log4NetDemo.Program property:[(null)] - 錯誤描述:error

System.Exception: 在這裏發生了一個異常,Error Number:2036084948」

 

第二篇數據庫日誌

對數據庫的支持(將相應的日誌信息寫到具體的表中,字段對應)

log4net是支持包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite在內的數據庫的,若是是文件型數據庫(如AccessSQLite)的話就須要指定數據庫文件的位置(在Web中最好指定在有讀寫權限的文件夾下,而且實現建立好表),若是是網絡數據庫就須要指定正確的數據庫鏈接字符串。

好比要記錄到Oracle數據庫中,在配置文件中能夠增長一個< appender>節點,配置以下:

 

Oracle表配置的寫法:

一、咱們將Log存到數據庫中。

<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">

  <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

  <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" />

  <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />

  <bufferSize value="128" />

  <parameter>

    <parameterName value=":log_date" />

    <dbType value="DateTime" />

    <layout type="log4net.Layout.RawTimeStampLayout" />

  </parameter>

  <parameter>

    <parameterName value=":thread" />

    <dbType value="String" />

    <size value="255" />

    <layout type="log4net.Layout.PatternLayout">

      <conversionPattern value="%thread" />

    </layout>

  </parameter>

  <parameter>

    <parameterName value=":log_level" />

    <dbType value="String" />

    <size value="50" />

    <layout type="log4net.Layout.PatternLayout">

      <conversionPattern value="%level" />

    </layout>

  </parameter>

  <parameter>

    <parameterName value=":logger" />

    <dbType value="String" />

    <size value="255" />

    <layout type="log4net.Layout.PatternLayout">

      <conversionPattern value="%logger" />

    </layout>

  </parameter>

  <parameter>

    <parameterName value=":message" />

    <dbType value="String" />

    <size value="4000" />

    <layout type="log4net.Layout.PatternLayout">

      <conversionPattern value="%message" />

    </layout>

  </parameter>

</appender>

 

參數中的寫法和數據庫有關,如其餘數據庫是 @參數,不一樣的數據庫寫法稍微不一樣.

<appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral" />
<!--SQLite鏈接字符串-->
<connectionString value="Data Source=c://log4net.db;Version=3;" />
<commandText value="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)" />
<parameter>
<parameterName value="@Date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@Level" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@Logger" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@Source" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%file:%line" />
</layout>
</parameter>
<parameter>
<parameterName value="@Message" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>

 

二、數據庫中表log的建立:

create table log (

   Datetime timestamp(3),

   Thread varchar2(255),

   Log_Level varchar2(255),

   Logger varchar2(255),

   Message varchar2(4000)

   );

 

控制日誌文件大小的問題

對於一個長時間使用而且有大量業務日誌的系統來講,若是使用FileAppender將日誌一直記錄到一個文件中會引發性能低下的問題,日誌文件太大,最後系統沒法及時響應了.

 

兩種解決方法:

1、限制每一個文件最大容量

2、分日期存儲日誌文件(好用)

 

1、下面是將日誌文件放到10個文件中,若是記錄的日誌超過10個,會從RollingFileAppender_log.txt.1開始覆蓋。

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

  <file value="RollingFileAppender_log.txt" />

  <appendToFile value="true" />

  <rollingStyle value="Size" />

  <maxSizeRollBackups value="10" />

  <maximumFileSize value="100KB" />

  <staticLogFileName value="true" />

  <layout type="log4net.Layout.PatternLayout">

    <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />

  </layout>

</appender>

 

 

2按照日期記錄日誌,它的配置以下:

<appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">

  <file value="RollingLogFileAppender_DateFormat_log.txt" />

  <appendToFile value="true" />

  <rollingStyle value="Date" />

  <!--<datePattern value="yyyyMMdd-HHmm" />-->

  <datePattern value="yyyyMMdd" />

  <layout type="log4net.Layout.PatternLayout">

    <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />

  </layout>

</appender>

 

 

3、關閉相應的日誌,只需註釋相應部分:

<root>

  <!--文件形式記錄日誌-->

  <appender-ref ref="LogFileAppender" />

  <!--控制檯控制顯示日誌-->

  <appender-ref ref="ConsoleAppender" />

  <!--Windows事件日誌-->

  <!--<appender-ref ref="EventLogAppender" />-->

  <!--SQLite事件日誌-->

  <appender-ref ref="AdoNetAppender_SQLite" />

  <!--RollingFileAppender事件日誌-->

  <appender-ref ref="RollingFileAppender" />

  <!--RollingFileAppender事件日誌,天天一個日誌-->

  <appender-ref ref="RollingLogFileAppender_DateFormat" />

  <!-- 若是不啓用相應的日誌記錄,能夠經過這種方式註釋掉

  <appender-ref ref="AdoNetAppender_Access" />

  -->

 

</root>

 

第三篇實用篇

將開源的Apache項目應用到咱們實際的系統之中:

一、配置文件詳細(直接複製改變數據庫配置即可以使用):

<?xml version="1.0"?>

<configuration>

  <configSections>

    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

  </configSections>

  <log4net>

    <!--定義輸出到文件中-->

 

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">

      <!--定義文件存放位置-->

      <file value="log\\"/>

      <appendToFile value="true"/>

      <!--下面這句表示存儲的是以日期-->

      <rollingStyle value="Date"/>

      <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>

      <staticLogFileName value="false"/>

      <param name="MaxSizeRollBackups" value="100"/>

      <layout type="log4net.Layout.PatternLayout">

        <!--每條日誌末尾的文字說明-->

        <!--<footer value="Log4Net" />-->

        <!--輸出格式

        樣例:2016-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->

        <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />-->

        <conversionPattern value="記錄時間:%date 線程ID:[%thread] 日誌級別:%-5level 出錯類:%logger property: [%property{NDC}] - 錯誤描述:%message%newline"/>

      </layout>

    </appender>

 

    <!--OracleClinet Appender Usage-->

    <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">

      <!--<connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient"/>-->

      <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

      <connectionString value="data source=****;User ID=****;Password=****" />

      <commandText value="INSERT INTO LOG4NET (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />

      <bufferSize value="128" />

      <!--數據庫日誌的字段參數設定以下-->

      <parameter>

        <parameterName value=":log_date" />

        <dbType value="Date" />

        <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />

      </parameter>

      <parameter>

        <parameterName value=":thread" />

        <dbType value="String" />

        <size value="255" />

        <layout type="log4net.Layout.PatternLayout" value="%thread" />

      </parameter>

      <parameter>

        <parameterName value=":log_level" />

        <dbType value="String" />

        <size value="50" />

        <layout type="log4net.Layout.PatternLayout" value="%level" />

 

      </parameter>

      <parameter>

        <parameterName value=":logger" />

        <dbType value="String" />

        <size value="255" />

        <layout type="log4net.Layout.PatternLayout" value="%logger" />

      </parameter>

      <parameter>

        <parameterName value=":message" />

        <dbType value="String" />

        <size value="4000" />

        <layout type="log4net.Layout.PatternLayout" value="%message" />

      </parameter>

    </appender>

 

    <root>

      <level value="ALL"/>

      <!--文件形式記錄日誌-->

      <!--<appender-ref ref="AdoNetAppender_Oracle"/>-->

      <!--文件形式記錄日誌-->

      <appender-ref ref="RollingLogFileAppender"/>

 

      <!--若是不啓用其中的某一類別,那麼註釋就行了-->

      <!--控制檯控制顯示日誌-->

      <!--<appender-ref ref="ConsoleAppender" />-->

      <!--Windows事件日誌-->

      <!--<appender-ref ref="EventLogAppender" />-->

      <!--<appender-ref ref="AdoNetAppender_Access" />-->

 

    </root>

  </log4net>

</configuration>

 

 

擴展封裝的接口,五種類別寫日誌的方法,如WriteDebugLog()

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

namespace log4net.LogHelper

{

    public class LogHelper : IDisposable

    {

        ///public static LogHelper LogProvider;

 

        public void Dispose()

        {

            ///GC.SuppressFinalize(LogProvider);

            GC.SuppressFinalize(this);

        }

 

        //Fatal

        public void WriteFatalLog(Type t, string msg)

        {

            ILog log = log4net.LogManager.GetLogger(t);

            log.Fatal(msg);

        }

 

        //Error

        public void WriteErrorLog(Type t, string msg)

        {

            ILog log = log4net.LogManager.GetLogger(t);

            log.Error(msg);

        }

 

        //Info

        public void WriteInfoLog(Type t, string msg)

        {

            ILog log = log4net.LogManager.GetLogger(t);

            log.Info(msg);

        }

 

        //Debug

        public void WriteDebugLog(Type t, string msg)

        {

            ILog log = log4net.LogManager.GetLogger(t);

            log.Debug(msg);

        }

 

        //Warn

        public void WriteWarnLog(Type t, string msg)

        {

            ILog log = log4net.LogManager.GetLogger(t);

            log.Warn(msg);

        }

    }

}

以上屬於基礎設施建設,實用操做步驟:

1、配置文件導入系統運行,如此應用程序在全部的界面都能讀取配置文件內容。

 2、在項目中添加對這兩個dll的 引用。

3、以下,按鈕事件中觸發寫日誌,模擬錯誤或異常操做。

4、在應用程序運行路徑下自動生產了按日期排列的文件,以下:

這即是對日誌的記錄,的操做。

 

附:

對網上開源版本進行了封裝適合本身使用的dll。按照上面步驟可直接用.

Apache開源代碼:在官網可下載.

誰知道這個怎麼掛附件。

 

感謝閱讀!

相關文章
相關標籤/搜索