Log4net在MVC中的應用

1、插件背景與功能

Log4net是基於.net開發的一款非常著名的記錄日誌開源組件。他最早是2001年7月由NeoWorks Limited啓動的項目,基本的框架源於另外的一個非常著名的姐妹組件-log4j。Log4net記錄日誌的功能非常強大。它可以將日誌分不同的等級,比不同的樣式,將日誌輸出到不同的媒介。

Log4net可以從http://logging.apache.org/log4net/downloads.html網站下載最新版本,引用log4net.dll組件,從你下載下來的src目錄log4net.sln文件生成後便會自動編譯log4net.dll文件了.

記錄日誌的分類:Log4net能夠以多種方式輸出日誌。支持的日誌輸出常用的主要媒介有數據庫(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite,控制檯,文件,事件日誌(可以用事件查看器查看)和郵件等多種方式。
日誌的級別:Log4net支持多種級別的日誌。優先級從高到低依次排列如下:FATAL > ERROR > WARN > INFO > DEBUG,此外還有ALL(允許所有的日誌請求)和OFF(拒絕所有的日誌請求)這兩種特殊的級別。

 

2、插件使用

Log4net.dll有多個版本,通常我們現在常用的有1.20.10與1.20.13版的。兩個版本在應用程序的配置文件中的section節點的配置有差異,針對每個版本詳細配置請百度,谷歌查詢。

A.插件的配置

下面我介紹下1.20.13最新版的log4net.dll的配置與使用。

首先,在項目中添加log4net.dll的引用

引入完成後,需要在Web.Config文件中配置log4net的切入點與日誌的輸出配置,日誌的輸出分爲很多種,常見的輸出方式可以分類爲文件形式的輸出,數據庫形式的輸出,郵件形式的輸出。

下面我來介紹下文件形式的輸出,與數據庫形式的輸出配置。

在Web.Config->configuration->configSections 節點下添加Log4net的配置塊:

 <configSections>

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

    </configSections>

然後在Configuration節點下配置log4net的詳細配置如下:

 <log4net>

        <!-- 文件輸出 -->

   <appender name="LogFileAppender" type="log4net.Appender.FileAppender">

            <file value="Logs\log-file.txt" />

            <appendToFile value="true" />

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

                <header value="[Header]" />

                <footer value="[Footer]" />

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

            </layout>

        </appender>

<!--數據庫輸出-->

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

            <bufferSize value="100" />

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

            <connectionString value="data source=LITIANYUAN;initial catalog=tempdb;integrated security=false;persist security info=True;User ID=sa;Password=sasasa" />

            <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />

            <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>

            <parameter>

                <parameterName value="@exception" />

                <dbType value="String" />

                <size value="2000" />

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

            </parameter>

        </appender>

 

 <root>

            <level value="ALL" />

            <appender-ref ref="LogFileAppender" />

        </root>

        <!-- Specify the level for some specific categories -->

        <logger name="ConsoleApp" additivity="false">

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

            <level value="ALL" />

            <appender-ref ref="AdoNetAppender" />

        </logger>

</log4net>

 

在上面的配置中,appender節點決定日誌輸出的方式。root節點是配置默認的日誌方式,logger節點是配置其他的日誌輸出方式,默認是繼承Root,如果想logger方式中不繼承root,則在logger節點上配置一個屬性additivity=”false”即可。如果是數據庫輸出方式,請參考log4net官網中在數據庫中建立對應的表結構。

B.插件的使用

在研究中發現Log4net使用時注入有兩種方式:

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”

ConfigFileExtension則是指明瞭和可執行程序集同名的配置文件的擴展名,例如,應用程序的名稱是”test.exe”,ConfigFileExtension=”txt”,則配置文件就應該是”test.exe.txt” ;

也可以不帶參數應用DOMConfiguratio():

[assembly: log4net.Config.DOMConfigurator()]

也可以在程序代碼中用DOMConfigurator類打開配置文件。類的構造函數需要一個FileInfo對象作參數,以指出要打開的配置文件名。 這個方法和前面在程序集裏設置屬性打開一個配置文件的效果是一樣的。

2、命名空間注入:

在需要使用的地方的命名空間(namaspace)上注入log4net的配置。

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

namespace Mvc1.Controllers

{

}

這樣也可以達到注入的效果。

 

兩種方式都試驗過,都沒問題。Log4net的配置注入只需要一次就完成,其他地方使用則不需要重複注入就可以直接使用。

初始化Loger

ILoglogger=log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

GetLogger參數可以是當前應用程序的位置。

如果參數是配置文件中Logger節點的Name,則是使用不同的loger輸出方式來初始話loger。

調用方式如下,分別對應的是每種不同級別的日誌:

logger.Debug("測試------------->");

logger.Debug("調用RegisterStartupScript()方法");

logger.Debug("調試");

logger.Error("這是一個錯誤日誌");

logger.Fatal("這是一個致命的錯誤日誌");

logger.Warn("這是一條警告日誌");

logger.Info("這是一條普通信息");

 

到此位置整個的配置和使用過程已經結束了。可以找到之前配置的文件日誌或者數據庫日誌表,進行查看日誌信息。

3總結

使用log4net可以很方便地爲應用添加日誌功能。應用Log4net,使用者可以很精確地控制日誌信息的輸出,減少了多餘信息,提高了日誌記錄性能。同時,通過外部配置文件,用戶可以不用重新編譯程序就能改變應用的日誌行爲,使得用戶可以根據情況靈活地選擇要記錄的信息。

發佈了47 篇原創文章 · 獲贊 33 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章