日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET版开源日志框架Log4Net详解

發(fā)布時間:2023/12/10 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET版开源日志框架Log4Net详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

來源:Yaopengfei

鏈接:http://www.cnblogs.com/yaopengfei/p/9428206.html


一、Log4Net簡介


Log4net是從Java中的Log4j遷移過來的一個.Net版的開源日志框架,它的功能很強(qiáng)大,可以將日志分為不同的等級,以不同的格式輸出到不同的存儲介質(zhì)中,比如:數(shù)據(jù)庫、txt文件、內(nèi)存緩沖區(qū)、郵件、控制臺、ANSI終端、遠(yuǎn)程接收端等等,我們這里主要介紹最常用的兩種:txt文件和數(shù)據(jù)庫。


(PS:其它的存儲介質(zhì)詳見 http://logging.apache.org/log4net/release/config-examples.html)


Log4net將日志分為五個級別,分別是: FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般信息) > DEBUG(調(diào)試信息),每個級別都對應(yīng)著一組重載方法進(jìn)行調(diào)用。


官網(wǎng)地址:http://logging.apache.org/log4net/index.html

Nuget地址:https://www.nuget.org/packages/log4net/

Nuget安裝:Install-Package log4net

最新版本:2.0.8 (2018-08-09)


本節(jié)主要圍繞兩個主要的存儲介質(zhì):【txt文件】和【SQLServer數(shù)據(jù)庫】展開,涵蓋的知識點(diǎn)有:


①. 基本的使用步驟。

②. 初始化關(guān)聯(lián)配置文件的幾種形式。

③. 代碼調(diào)用詳解。

④. 配置文件詳解。

⑤. 簡單的封裝和在MVC框架中的調(diào)用。?


二、基本使用步驟


我們先以控制臺程序為例,簡單介紹Log4net存儲日志到txt文本文檔中,后面在做代碼的詳解。


1、新建01-SimpleDemo控制臺程序,通過指令 【Install-Package log4net】安裝相應(yīng)程序集。



2、在默認(rèn)配置文件中App.config(B/S程序則為web.config)中進(jìn)行配置,主要分兩塊:


A. 在<configuration></configuration>節(jié)點(diǎn)下新增節(jié)點(diǎn)下新增(要在其最頂部):


<configSections>

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

</configSections>


B. 在<configuration></configuration>根節(jié)點(diǎn)下,配置log4net的核心配置代碼, 主要節(jié)點(diǎn)如下:


<log4net> <appender> </appender> <root></root> </log4net>


詳細(xì)代碼如下:


<?xml version="1.0" encoding="utf-8" ?>

<configuration>

? <!-- 1. 添加log4net的節(jié)點(diǎn)聲明配置代碼-->

? <configSections>

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

? </configSections>

? <!--2. log4net的核心配置代碼-->

? <log4net> ??

? ? <!--把日志信息輸出到以日期命名的文件里-->

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

? ? ? <!--文件夾的位置-->

? ? ? <file value="D:MyLog1" />

? ? ? <appendToFile value="true" />

? ? ? <!--動態(tài)生成文件名-->

? ? ? <param name="StaticLogFileName" value="false" />

? ? ? <!--以日期命名-->

? ? ? <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;" />

? ? ? <rollingStyle value="Date" />

? ? ? <!--日志在日志文件中的布局方式-->

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

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

? ? ? </layout>

? ? ? <!--使用最小鎖定模型(minimal locking model),以允許多個進(jìn)程可以寫入同一個文件 -->

? ? ? <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

? ? </appender>?

? ? <root>

? ? ? <level value="ALL"></level>

? ? ? <appender-ref ref="RollingFileAppender"></appender-ref>

? ? </root>?

? </log4net>

? <startup>

? ? <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />

? </startup>

</configuration>


3、代碼調(diào)用


log4net.Config.XmlConfigurator.Configure();

ILog log = LogManager.GetLogger("test");

log.Debug("調(diào)試信息");


4、運(yùn)行結(jié)果


截止此處,日志保存成功。



三、初始化配置文件


前面提到在默認(rèn)配置文件中App.config(B/S程序則為web.config)中進(jìn)行配置,可以通過代碼 ?log4net.Config.XmlConfigurator.Configure(); 來初始化配置,或者還可以通過 [assembly: log4net.Config.XmlConfigurator()] ?反射的形式進(jìn)行初始化配置,二者可以達(dá)到同樣的效果,代表了兩種初始化配置文件的形式。


PS: [assembly: log4net.Config.XmlConfigurator()] ?可以加在 當(dāng)前使用文件的 namespace上作用于當(dāng)前文件,或者加在Properties/AssemblyInfo.cs中,則該項目全局都無須再初始化了。


?

在實(shí)際項目中,默認(rèn)的配置文件里可能包含很多框架的信息,這個時候把 log4net的配置代碼再放入進(jìn)去,就會顯得有點(diǎn)雜亂,或者有些“奇葩”的人把默認(rèn)配置文件改名了,這個時候使用上述默認(rèn)的兩種方式就不好用了,那么這種情況怎么處理呢?


這里重點(diǎn)介紹 通過 log4net.Config.XmlConfigurator.Configure(); 來關(guān)聯(lián)配置文件。


情況一: 使用默認(rèn)配置文件的情況


1、代碼配置:log4net.Config.XmlConfigurator.Configure();

2、反射配置:[assembly: log4net.Config.XmlConfigurator()]?


情況二:修改默認(rèn)配置文件的名稱為:App1.config (這里只是舉例,很少有修改默認(rèn)配置文件名稱的)


1、代碼配置: 首先將App1.config文件的屬性中的“生成操作”改為“ 嵌入的資源”,然后通過以下代碼進(jìn)行配置。


Assembly assembly = Assembly.GetExecutingAssembly();

var xml = assembly.GetManifestResourceStream("_01_SimpleDemo.App1.config");

log4net.Config.XmlConfigurator.Configure(xml);


注:代碼中的 _01_SimpleDemo 為命名空間名。


2、反射配置:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml")] ? ??


注:用這種方式屬性中的:復(fù)制到輸出目錄需要改為:始終復(fù)制,生成操作不需要配置,使用默認(rèn):無 ?即可


?

情況三:新建單獨(dú)xml文件,進(jìn)行l(wèi)og4net的配置 (推薦采用這種方式,和原配置文件區(qū)分開,單獨(dú)配置方便,處理方式和情況二是一致的)


1、代碼配置:首先將log4net.xml文件的屬性中的“生成操作”改為“ 嵌入的資源”,然后通過以下代碼進(jìn)行配置。


Assembly assembly = Assembly.GetExecutingAssembly();

var xml = assembly.GetManifestResourceStream("_01_SimpleDemo.log4net.xml");

log4net.Config.XmlConfigurator.Configure(xml);


注:代碼中的 _01_SimpleDemo 為命名空間名。


情況四:無論是修改默認(rèn)配置文件的名稱為 或者 新建單獨(dú)的xml作為配置文件 → 可以通過絕對路徑的方式進(jìn)行處理 【不推薦這種方式】


1、直接寫絕對路徑 (注意這種方式【不需要】配置文件屬性為 “嵌入的資源”)


log4net.Config.XmlConfigurator.Configure(new FileInfo(@"D:-我的開發(fā)之路DotNet體系-DotNet框架篇-Log4net詳解Code-SimpleDemolog4net.xml"));


2 通過代碼獲取絕對路徑 (注意這種方式【不需要】配置文件屬性的“生成操作”改為 “嵌入的資源”,但需要改為“始終復(fù)制”,確保輸出到bin文件下)


string assemblyFilePath = Assembly.GetExecutingAssembly().Location;

string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);

string configFilePath = assemblyDirPath + " //log4net.xml";

log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath));


PS:B/S程序下通過 ?log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~") + @"/log4net.xml")); 來配置。


四、代碼調(diào)用詳解


Log4net允許多個ILog對象同時存在,通過代碼:ILog log = LogManager.GetLogger("xxx"); 來創(chuàng)建。


A: 日志級別由高到低分別為:FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般信息) > DEBUG(調(diào)試信息),另外還有 OFF和 ALL 。


幾點(diǎn)說明:OFF表示所有信息都不寫入,ALL表示所有信息都寫入,我們也可以通過:<root><level value = "WARN" ></ level ></root>這樣配置,表示W(wǎng)ARN級別以及高于WARN以上的級別才會被寫入日志。


B: 寫入日志的方法有:Debug、Error、Fatal、Info、Warn五個方法,每個方法都有兩個重載,如下圖:



分享在使用配置文件為log4net.xml的情況下的調(diào)用代碼:


Assembly assembly = Assembly.GetExecutingAssembly();

var xml = assembly.GetManifestResourceStream("_01_SimpleDemo.log4net.xml");

log4net.Config.XmlConfigurator.Configure(xml);

ILog log = LogManager.GetLogger("test");

log.Debug("調(diào)試信息");

log.Info("一般信息");

log.Warn("警告");

try

{

? ?int.Parse("ddd");

}

catch (Exception ex)

{

? ? log.Error("一般錯誤", ex);

}

log.Fatal("致命錯誤");


五、配置文件詳解


Log4net的配置文件主要分為兩大部分:分別是 【自定義配置節(jié)點(diǎn)】和?

【核心代碼配置】,自定義配置節(jié)點(diǎn)代碼固定,如下圖,核心代碼配置主要位于:<log4net></log4net>節(jié)點(diǎn)中,里面包括<appender></appender>節(jié)點(diǎn)配置日日志輸出途徑 和 <root></root>節(jié)點(diǎn),用于設(shè)置記錄日志的級別和啟用哪些輸出途徑。  



幾點(diǎn)說明:


1、自定義配置節(jié)點(diǎn) ?<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 代碼固定,直接復(fù)制即可。


2、<root></root> 節(jié)點(diǎn)主要用來: 配置日志的的輸出級別和加載日志的輸出途徑。


A: level中的value值表示該值及其以上的日志級別才會輸出,日志級別包括:OFF > FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般信息) > DEBUG(調(diào)試信息) > ALL ,比如:


<level value="INFO"></level> 表示只有INFO及其以上的日志級別才會被保存。

PS:OFF表示所有信息都不寫入,ALL表示所有信息都寫入。


B: <appender-ref></appender-ref>標(biāo)簽用于加載日志的輸出途徑代碼,通過ref和appender標(biāo)簽的中name屬性相關(guān)聯(lián),比如:


<appender-ref ref="RollingFileAppender"></appender-ref> ?表示開啟txt文檔保存日志的方式。


3、<appender></appender>節(jié)點(diǎn),用來配置日志的輸出途徑的,本節(jié)主要介紹了輸出到 【txt文本文檔】中 和 【數(shù)據(jù)庫】。


A:分享一下數(shù)據(jù)庫的表結(jié)構(gòu),詳細(xì)配置見下面的代碼分享,需要注意字段類型相匹配,并且要顯式指定其長度。


?

B:關(guān)于txt文本文檔的命名,可以存放到一個文件夾里,也可以按照時間來區(qū)分文件夾,并且命名可以 動態(tài)+指定命名的方式。



C:關(guān)于日志文件大小的說明和文件個數(shù)的說明,主要需要三個節(jié)點(diǎn)配合使用(實(shí)際開發(fā)中,如果一個txt特別大,打開的時候會非常的慢,卡頓,所以該步驟有必要配置一下)。


PS:首先要配置 RollingStyle 節(jié)點(diǎn)為Size模式或者Composite模式,然后配置 maximumFileSize 節(jié)點(diǎn)設(shè)置每個文件的大小,最后配置 MaxSizeRollBackups 節(jié)點(diǎn),設(shè)置日志文件的個數(shù)。超出大小后在所有文件名后自動增加正整數(shù)重新命名,數(shù)字最大的最早寫入。


用下面的代碼簡單測試一下:


<param name="RollingStyle" value="Composite" />

<param name="maximumFileSize" value="10KB" />

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



詳細(xì)代碼如下:


<?xml version="1.0" encoding="utf-8" ?>

<configuration>

? <!-- 一. 添加log4net的自定義配置節(jié)點(diǎn)-->

? <configSections>

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

? </configSections>

? <!--二. log4net的核心配置代碼-->

? <log4net>

? ? <!--(一) 配置日志的輸出途徑-->

? ? <!--1. 輸出途徑(一) 將日志以回滾文件的形式寫到文件中-->

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

? ? ? <!--1.1 文件夾的位置(也可以寫相對路徑)-->

? ? ? <param name="File" ?value="D:MyLog1" />

? ? ? <!--相對路徑 ?C/S程序生成在Debug目錄下-->

? ? ? <!--<param name="File" ?value="/Logs/" />-->

? ? ? <!--1.2 是否追加到文件-->

? ? ? <param name="AppendToFile" value="true" />

? ? ? <!--1.3 使用最小鎖定模型(minimal locking model),以允許多個進(jìn)程可以寫入同一個文件 -->

? ? ? <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

? ? ? <!--1.4 配置Unicode編碼-->

? ? ? <Encoding value="UTF-8" />

? ? ? <!--1.5 是否只寫到一個文件里-->

? ? ? <param name="StaticLogFileName" value="false" />

? ? ? <!--1.6 配置按照何種方式產(chǎn)生多個日志文件 (Date:日期、Size:文件大小、Composite:日期和文件大小的混合方式)-->

? ? ? <param name="RollingStyle" value="Composite" />

? ? ? <!--1.7 介紹多種日志的的命名和存放在磁盤的形式-->

? ? ? <!--1.7.1 在根目錄下直接以日期命名txt文件 注意&quot;的位置,去空格 -->

? ? ? <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />

? ? ? <!--1.7.2 在根目錄下按日期產(chǎn)生文件夾,文件名固定 test.log ?-->

? ? ? <!--<param name="DatePattern" value="yyyy-MM-dd/&quot;test.log&quot;" ?/>-->

? ? ? <!--1.7.3 在根目錄下按日期產(chǎn)生文件夾,這是按日期產(chǎn)生文件夾,并在文件名前也加上日期 ?-->

? ? ? <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd&quot;-test.log&quot;" ?/>-->

? ? ? <!--1.7.4 在根目錄下按日期產(chǎn)生文件夾,這再形成下一級固定的文件夾 ?-->

? ? ? <!--<param name="DatePattern" value="yyyyMMdd/&quot;OrderInfor/test.log&quot;" ?/>-->

? ? ? <!--1.8 配置每個日志的大小。【只在1.6 RollingStyle 選擇混合方式與文件大小方式下才起作用!!!】可用的單位:KB|MB|GB。不要使用小數(shù),否則會一直寫入當(dāng)前日志,

? ? ? 超出大小后在所有文件名后自動增加正整數(shù)重新命名,數(shù)字最大的最早寫入。-->

? ? ? <param name="maximumFileSize" value="10MB" />

? ? ? <!--1.9 最多產(chǎn)生的日志文件個數(shù),超過則保留最新的n個 將value的值設(shè)置-1,則不限文件個數(shù) 【只在1.6 RollingStyle 選擇混合方式與文件大小方式下才起作用!!!】

? ? ? ? 與1.8中maximumFileSize文件大小是配合使用的-->

? ? ? <param name="MaxSizeRollBackups" value="5" />

? ? ? <!--1.10 配置文件文件的布局格式,使用PatternLayout,自定義布局-->

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

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

? ? ? </layout>

? ? </appender>


? ? <!--2. 輸出途徑(二) 記錄日志到數(shù)據(jù)庫-->

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

? ? ? <!--2.1 設(shè)置緩沖區(qū)大小,只有日志記錄超設(shè)定值才會一塊寫入到數(shù)據(jù)庫-->

? ? ? <param name="BufferSize" value="1" />

? ? ? <!--2.2 引用-->

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

? ? ? <!--2.3 數(shù)據(jù)庫連接字符串-->

? ? ? <connectionString value="data source=localhost;initial catalog=LogDB;integrated security=false;persist security info=True;User ID=sa;Password=123456" />

? ? ? <!--2.4 SQL語句插入到指定表-->

? ? ? <commandText value="INSERT INTO LogInfor ([threadId],[log_level],[log_name],[log_msg],[log_exception],[log_time]) VALUES (@threadId, @log_level, @log_name, @log_msg, @log_exception,@log_time)" />

? ? ? <!--2.5 數(shù)據(jù)庫字段匹配-->

? ? ? <!-- 線程號-->

? ? ? <parameter>

? ? ? ? <parameterName value="@threadId" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="100" />

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

? ? ? ? ? <conversionPattern value="%thread" />

? ? ? ? </layout>

? ? ? </parameter>

? ? ? <!--日志級別-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_level" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="100" />

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

? ? ? ? ? <conversionPattern value="%level" />

? ? ? ? </layout>

? ? ? </parameter>

? ? ? <!--日志記錄類名稱-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_name" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="100" />

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

? ? ? ? ? <conversionPattern value="%logger" />

? ? ? ? </layout>

? ? ? </parameter>

? ? ? <!--日志信息-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_msg" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="5000" />

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

? ? ? ? ? <conversionPattern value="%message" />

? ? ? ? </layout>

? ? ? </parameter>

? ? ? <!--異常信息 ?指的是如Infor 方法的第二個參數(shù)的值-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_exception" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="2000" />

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

? ? ? </parameter>

? ? ? <!-- 日志記錄時間-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_time" />

? ? ? ? <dbType value="DateTime" />

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

? ? ? </parameter>

? ? </appender>

? ? <!--(二). 配置日志的的輸出級別和加載日志的輸出途徑-->

? ? <root>

? ? ? <!--1. level中的value值表示該值及其以上的日志級別才會輸出-->

? ? ? <!--OFF > FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般信息) > DEBUG(調(diào)試信息) ?> ALL ?-->

? ? ? <!--OFF表示所有信息都不寫入,ALL表示所有信息都寫入-->

? ? ? <level value="ALL"></level>

? ? ? <!--2. append-ref標(biāo)簽表示要加載前面的日志輸出途徑代碼 ?通過ref和appender標(biāo)簽的中name屬性相關(guān)聯(lián)-->

? ? ? <appender-ref ref="RollingFileAppender"></appender-ref>

? ? ? <appender-ref ref="AdoNetAppender"></appender-ref>

? ? </root>

? </log4net>

</configuration>


六、簡單的封裝及完整代碼分享


這里模擬在系統(tǒng)框架中對Log4net進(jìn)行簡單的封裝,然后在MVC框架中調(diào)用,并分享全部代碼。


步驟一:新建Ypf.Utils類庫,作為工具類庫,引入log4net程序集,并將前面用到的log4net.xml 復(fù)制進(jìn)來,改屬性為嵌入資源,然后新建LogUtils類(不要起名為LogHelp),對Log4net的方法進(jìn)行簡單的封裝,主要包括:初始化代碼、ILog實(shí)例創(chuàng)建、五類日志級別的封裝。



?log4net.xml文件代碼如下:


?<?xml version="1.0" encoding="utf-8" ?>

?<configuration>

? ?<!-- 一. 添加log4net的自定義配置節(jié)點(diǎn)-->

? ?<configSections>

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

? ?</configSections>

? ?<!--二. log4net的核心配置代碼-->

? ?<log4net>

? ? ?<!--(一) 配置日志的輸出途徑-->

? ? ?<!--1. 輸出途徑(一) 將日志以回滾文件的形式寫到文件中-->

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

? ? ? ?<!--1.1 文件夾的位置(也可以寫相對路徑)-->

? ? ? ?<param name="File" ?value="D:MyLog1" />

? ? ? ?<!--相對路徑-->

? ? ? ?<!--<param name="File" ?value="Logs/" />-->

? ? ? ?<!--1.2 是否追加到文件-->

? ? ? ?<param name="AppendToFile" value="true" />

? ? ? ?<!--1.3 使用最小鎖定模型(minimal locking model),以允許多個進(jìn)程可以寫入同一個文件 -->

? ? ? ?<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

? ? ? ?<!--1.4 配置Unicode編碼-->

? ? ? ?<Encoding value="UTF-8" />

? ? ? ?<!--1.5 是否只寫到一個文件里-->

? ? ? ?<param name="StaticLogFileName" value="false" />

? ? ? ?<!--1.6 配置按照何種方式產(chǎn)生多個日志文件 (Date:日期、Size:文件大小、Composite:日期和文件大小的混合方式)-->

? ? ? ?<param name="RollingStyle" value="Composite" />

? ? ? ?<!--1.7 介紹多種日志的的命名和存放在磁盤的形式-->

? ? ? ?<!--1.7.1 在根目錄下直接以日期命名txt文件 注意&quot;的位置,去空格 -->

? ? ? ?<param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />

? ? ? ?<!--1.7.2 在根目錄下按日期產(chǎn)生文件夾,文件名固定 test.log ?-->

? ? ? ?<!--<param name="DatePattern" value="yyyy-MM-dd/&quot;test.log&quot;" ?/>-->

? ? ? ?<!--1.7.3 在根目錄下按日期產(chǎn)生文件夾,這是按日期產(chǎn)生文件夾,并在文件名前也加上日期 ?-->

? ? ? ?<!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd&quot;-test.log&quot;" ?/>-->

? ? ? ?<!--1.7.4 在根目錄下按日期產(chǎn)生文件夾,這再形成下一級固定的文件夾 ?-->

? ? ? ?<!--<param name="DatePattern" value="yyyyMMdd/&quot;OrderInfor/test.log&quot;" ?/>-->

? ? ? ?<!--1.8 配置每個日志的大小。【只在1.6 RollingStyle 選擇混合方式與文件大小方式下才起作用!!!】可用的單位:KB|MB|GB。不要使用小數(shù),否則會一直寫入當(dāng)前日志,

? ? ? ?超出大小后在所有文件名后自動增加正整數(shù)重新命名,數(shù)字最大的最早寫入。-->

? ? ? ?<param name="maximumFileSize" value="10MB" />

? ? ? ?<!--1.9 最多產(chǎn)生的日志文件個數(shù),超過則保留最新的n個 將value的值設(shè)置-1,則不限文件個數(shù) 【只在1.6 RollingStyle 選擇混合方式與文件大小方式下才起作用!!!】

? ? ? ? ?與1.8中maximumFileSize文件大小是配合使用的-->

? ? ? ?<param name="MaxSizeRollBackups" value="5" />

? ? ? ?<!--1.10 配置文件文件的布局格式,使用PatternLayout,自定義布局-->

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

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

? ? ? ?</layout>

? ? ?</appender>

?

? ? ?<!--2. 輸出途徑(二) 記錄日志到數(shù)據(jù)庫-->

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

? ? ? ?<!--2.1 設(shè)置緩沖區(qū)大小,只有日志記錄超設(shè)定值才會一塊寫入到數(shù)據(jù)庫-->

? ? ? ?<param name="BufferSize" value="1" />

? ? ? ?<!--2.2 引用-->

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

? ? ? ?<!--2.3 數(shù)據(jù)庫連接字符串-->

? ? ? ?<connectionString value="data source=localhost;initial catalog=LogDB;integrated security=false;persist security info=True;User ID=sa;Password=123456" />

? ? ? ?<!--2.4 SQL語句插入到指定表-->

? ? ? ?<commandText value="INSERT INTO LogInfor ([threadId],[log_level],[log_name],[log_msg],[log_exception],[log_time]) VALUES (@threadId, @log_level, @log_name, @log_msg, @log_exception,@log_time)" />

? ? ? <!--2.5 數(shù)據(jù)庫字段匹配-->

? ? ? <!-- 線程號-->

? ? ? <parameter>

? ? ? ? <parameterName value="@threadId" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="100" />

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

? ? ? ? ? <conversionPattern value="%thread" />

? ? ? ? </layout>

? ? ? </parameter>

? ? ? <!--日志級別-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_level" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="100" />

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

? ? ? ? ? <conversionPattern value="%level" />

? ? ? ? </layout>

? ? ? </parameter>

? ? ? <!--日志記錄類名稱-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_name" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="100" />

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

? ? ? ? ? <conversionPattern value="%logger" />

? ? ? ? </layout>

? ? ? </parameter>

? ? ? <!--日志信息-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_msg" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="5000" />

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

? ? ? ? ? <conversionPattern value="%message" />

? ? ? ? </layout>

? ? ? </parameter>

? ? ? <!--異常信息 ?指的是如Infor 方法的第二個參數(shù)的值-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_exception" />

? ? ? ? <dbType value="String" />

? ? ? ? <size value="2000" />

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

? ? ? </parameter>

? ? ? <!-- 日志記錄時間-->

? ? ? <parameter>

? ? ? ? <parameterName value="@log_time" />

? ? ? ? <dbType value="DateTime" />

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

? ? ? </parameter>

? ? </appender>

? ? <!--(二). 配置日志的的輸出級別和加載日志的輸出途徑-->

? ? <root>

? ? ? <!--1. level中的value值表示該值及其以上的日志級別才會輸出-->

? ? ? <!--OFF > FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般信息) > DEBUG(調(diào)試信息) ?> ALL ?-->

? ? ? <!--OFF表示所有信息都不寫入,ALL表示所有信息都寫入-->

? ? ? <level value="ALL"></level>

? ? ? <!--2. append-ref標(biāo)簽表示要加載前面的日志輸出途徑代碼 ?通過ref和appender標(biāo)簽的中name屬性相關(guān)聯(lián)-->

? ? ? <appender-ref ref="RollingFileAppender"></appender-ref>

? ? ? <appender-ref ref="AdoNetAppender"></appender-ref>

? ? </root>

? </log4net>

</configuration>


LogUtils類代碼如下:


using log4net;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Reflection;

using System.Text;

using System.Threading.Tasks;


namespace Ypf.Utils

{

? ? public class LogUtils

? ? {

? ? ? ? //可以聲明多個日志對象

? ? ? ? public static ILog log = LogManager.GetLogger(typeof(LogUtils));


? ? ? ? #region 01-初始化Log4net的配置

? ? ? ? /// <summary>

? ? ? ? /// 初始化Log4net的配置

? ? ? ? /// xml文件一定要改為嵌入的資源

? ? ? ? /// </summary>

? ? ? ? public static void InitLog4Net()

? ? ? ? {

? ? ? ? ? ? Assembly assembly = Assembly.GetExecutingAssembly();

? ? ? ? ? ? var xml = assembly.GetManifestResourceStream("Ypf.Utils.log4net.xml");

? ? ? ? ? ? log4net.Config.XmlConfigurator.Configure(xml);

? ? ? ? }

? ? ? ? #endregion





? ? ? ? /************************* 五種不同日志級別 *******************************/

? ? ? ? //FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般信息) > DEBUG(調(diào)試信息)


? ? ? ? #region 01-DEBUG(調(diào)試信息)

? ? ? ? /// <summary>

? ? ? ? /// Debug

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? public static void Debug(string msg)

? ? ? ? {

? ? ? ? ? ? log.Debug(msg);

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// Debug

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? /// <param name="exception">錯誤信息</param>

? ? ? ? public static void Debug(string msg, Exception exception)

? ? ? ? {

? ? ? ? ? ? log.Debug(msg, exception);

? ? ? ? }


? ? ? ? #endregion


? ? ? ? #region 02-INFO(一般信息)

? ? ? ? /// <summary>

? ? ? ? /// Info

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? public static void Info(string msg)

? ? ? ? {

? ? ? ? ? ? log.Info(msg);

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// Info

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? /// <param name="exception">錯誤信息</param>

? ? ? ? public static void Info(string msg, Exception exception)

? ? ? ? {

? ? ? ? ? ? log.Info(msg, exception);

? ? ? ? }

? ? ? ? #endregion


? ? ? ? #region 03-WARN(警告)

? ? ? ? /// <summary>

? ? ? ? /// Warn

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? public static void Warn(string msg)

? ? ? ? {

? ? ? ? ? ? log.Warn(msg);

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// Warn

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? /// <param name="exception">錯誤信息</param>

? ? ? ? public static void Warn(string msg, Exception exception)

? ? ? ? {

? ? ? ? ? ? log.Warn(msg, exception);

? ? ? ? }

? ? ? ? #endregion


? ? ? ? #region 04-ERROR(一般錯誤)

? ? ? ? /// <summary>

? ? ? ? /// Error

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? public static void Error(string msg)

? ? ? ? {

? ? ? ? ? ? log.Error(msg);

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// Error

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? /// <param name="exception">錯誤信息</param>

? ? ? ? public static void Error(string msg, Exception exception)

? ? ? ? {

? ? ? ? ? ? log.Error(msg, exception);

? ? ? ? }

? ? ? ? #endregion


? ? ? ? #region 05-FATAL(致命錯誤)

? ? ? ? /// <summary>

? ? ? ? /// Fatal

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? public static void Fatal(string msg)

? ? ? ? {

? ? ? ? ? ? log.Fatal(msg);

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// Fatal

? ? ? ? /// </summary>

? ? ? ? /// <param name="msg">日志信息</param>

? ? ? ? /// <param name="exception">錯誤信息</param>

? ? ? ? public static void Fatal(string msg, Exception exception)

? ? ? ? {

? ? ? ? ? ? log.Fatal(msg, exception);

? ? ? ? }


? ? ? ? #endregion

? ? }

}


步驟二:新建名Ypf.MVC的MVC5框架,添加對Ypf.Utils類庫的引用,在Global.asax全局文件中添加對 對Log4net進(jìn)行初始化。



然后就可以愉快的進(jìn)行調(diào)用測試了哦。


/// <summary>

/// 測試log4net

/// 首先需要再Global中初始化log4net

/// </summary>

/// <returns></returns>

public ActionResult Index()

{

? ? //FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般信息) > DEBUG(調(diào)試信息)

? ? LogUtils.Debug("出錯了");

? ? try

? ? {

? ? ? ? int.Parse("ddf");

? ? }

? ? catch (Exception ex)

? ? {

? ? ? ? LogUtils.Debug("出錯了",ex);

? ? }


? ? LogUtils.Info("出錯了");

? ? try

? ? {

? ? ? ? int.Parse("ddf");

? ? }

? ? catch (Exception ex)

? ? {

? ? ? ? LogUtils.Info("出錯了", ex);

? ? }


? ? LogUtils.Warn("出錯了");

? ? try

? ? {

? ? ? ? int.Parse("ddf");

? ? }

? ? catch (Exception ex)

? ? {

? ? ? ? LogUtils.Warn("出錯了", ex);

? ? }


? ? LogUtils.Error("出錯了");

? ? try

? ? {

? ? ? ? int.Parse("ddf");

? ? }

? ? catch (Exception ex)

? ? {

? ? ? ? LogUtils.Error("出錯了", ex);

? ? }


? ? LogUtils.Fatal("出錯了");

? ? try

? ? {

? ? ? ? int.Parse("ddf");

? ? }

? ? catch (Exception ex)

? ? {

? ? ? ? LogUtils.Fatal("出錯了", ex);

? ? }

? ? return View();

}


看完本文有收獲?請轉(zhuǎn)發(fā)分享給更多人~



總結(jié)

以上是生活随笔為你收集整理的.NET版开源日志框架Log4Net详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。