成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#中l(wèi)og4Net使用方法(二)

開(kāi)發(fā) 后端
本文主要介紹log4net使用方法,Log4net是一個(gè)第三方開(kāi)源組件,它設(shè)計(jì)的主要目的是組合,生成日志信息,同時(shí)將配置保存到各種存儲(chǔ)介質(zhì)或者展現(xiàn)平臺(tái)中。希望對(duì)你有幫助,一起來(lái)看。

 

接上一篇 C#中l(wèi)og4net使用方法(一)

Layout

Layout 組件用于向用戶顯示最后經(jīng)過(guò)格式化的輸出信息。輸出信息可以以多種格式顯示,主要依賴于我們采用的Layout組件類(lèi)型。可以是線性的或一個(gè)XML文件。Layout組件和一個(gè)Appender組件一起工作。API幫助手冊(cè)中有關(guān)于不同Layout組件的列表。一個(gè)Appender對(duì)象,只能對(duì)應(yīng)一個(gè)Layout對(duì)象。要實(shí)現(xiàn)你自己的Layout類(lèi),你需要從log4net.Layout.LayoutSkeleton類(lèi)繼承,它實(shí)現(xiàn)了ILayout接口。

 

 

4 在程序中使用log4net

在開(kāi)始對(duì)你的程序進(jìn)行日志記錄前,需要先啟動(dòng)log4net引擎。這意味著你需要先配置前面提到的三種組件。你可以用兩種方法來(lái)設(shè)定配置:在單獨(dú)的文件中設(shè)定配置或在代碼中定義配置。

因?yàn)橄旅鎺追N原因,推薦在一個(gè)單獨(dú)的文件中定義配置:

  • 你不需要重新編譯源代碼就能改變配置;
  • 你可以在程序正運(yùn)行的時(shí)候就改變配置。

這一點(diǎn)在一些WEB程序和遠(yuǎn)程過(guò)程調(diào)用的程序中有時(shí)很重要;

考慮到第一種方法的重要性,我們先看看怎樣在文件中設(shè)定配置信息。

(1)定義配置文件

配置信息可以放在如下幾種形式文件的一種中。

在程序的配置文件里,如AssemblyName.config 或web.config.

在你自己的文件里。文件名可以是任何你想要的名字,如AppName.exe.xyz等.

log4net框架會(huì)在相對(duì)于AppDomain.CurrentDomain.BaseDirectory 屬性定義的目錄路徑下查找配置文件。框架在配置文件里要查找的唯一標(biāo)識(shí)是<log4net>標(biāo)簽。一個(gè)完整的配置文件的例子如下:

 

 

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3. <configSections> 
  4. <section name="log4net"   
  5. type="log4net.Config.Log4NetConfigurationSectionHandler,  
  6. log4net-net-1.0" /> 
  7. </configSections> 
  8. <log4net> 
  9. <root> 
  10. <level value="WARN" /> 
  11. <appender-ref ref="LogFileAppender" /> 
  12. <appender-ref ref="ConsoleAppender" /></root> 
  13. <logger name="testApp.Logging"> 
  14. <level value="DEBUG"/> 
  15. </logger><appender name="LogFileAppender"   
  16. type="log4net.Appender.FileAppender" > 
  17. <param name="File" value="log-file.txt" /> 
  18. <param name="AppendToFile" value="true" /> 
  19. <layout type="log4net.Layout.PatternLayout"> 
  20. <param name="Header" value="[Header]\r\n"/> 
  21. <param name="Footer" value="[Footer]\r\n"/> 
  22. <param name="ConversionPattern"   
  23. value="%d [%t] %-5p %c [%x] - %m%n" 
  24. /> 
  25. </layout> 
  26. <filter type="log4net.Filter.LevelRangeFilter"> 
  27. <param name="LevelMin" value="DEBUG" /> 
  28. <param name="LevelMax" value="WARN" /> 
  29. </filter> 
  30. </appender> 
  31. <appender name="ConsoleAppender"   
  32. type="log4net.Appender.ConsoleAppender" > 
  33. <layout type="log4net.Layout.PatternLayout"> 
  34. <param name="ConversionPattern"   
  35. value="%d [%t] %-5p %c [%x] - %m%n"   
  36. /> 
  37. </layout> 
  38. </appender> 
  39. </log4net> 
  40. </configuration> 

 

你可以直接將上面的文本拷貝到任何程序中使用,但是最好還是能夠理解配置文件是怎樣構(gòu)成的。只有當(dāng)你需要在應(yīng)用程序配置文件中使用log4net配置時(shí),才需要在<configSection>標(biāo)簽中加入<section>配置節(jié)點(diǎn)入口。對(duì)于其他的單獨(dú)文件,只有<log4net>標(biāo)簽內(nèi)的文本才是必需的,這些標(biāo)簽的順序并不是固定的。下面我們依次講解各個(gè)標(biāo)簽內(nèi)文本的含義:

(2)<root>

 

  1. <root> 
  2. <level value="WARN" /> 
  3. <appender-ref ref="LogFileAppender" /> 
  4. <appender-ref ref="ConsoleAppender" /> 
  5. </root> 

 

 

在框架的體系里,所有的日志對(duì)象都是根日志(root logger)的后代。因此如果一個(gè)日志對(duì)象沒(méi)有在配置文件里顯式定義,則框架使用根日志中定義的屬性。在<root>標(biāo)簽里,可以定義level級(jí)別值和Appender的列表。如果沒(méi)有定義LEVEL的值,則缺省為DEBUG。可以通過(guò)<appender-ref>標(biāo)簽定義日志對(duì)象使用的Appender對(duì)象。<appender-ref>聲明了在其他地方定義的Appender對(duì)象的一個(gè)引用。在一個(gè)logger對(duì)象中的設(shè)置會(huì)覆蓋根日志的設(shè)置。而對(duì)Appender屬性來(lái)說(shuō),子日志對(duì)象則會(huì)繼承父日志對(duì)象的Appender列表。這種缺省的行為方式也可以通過(guò)顯式地設(shè)定<logger>標(biāo)簽的additivity屬性為false而改變。

 

  1. <logger name="testApp.Logging" additivity="false">  
  2. </logger> 

 

Additivity的值缺省是true.

  1. <Logger> 
  2. <logger name="testApp.Logging"> 
  3. <level value="DEBUG"/> 
  4. </logger> 

 

 

<logger> 元素預(yù)定義了一個(gè)具體日志對(duì)象的設(shè)置。然后通過(guò)調(diào)用LogManager.GetLogger(“testAPP.Logging”)函數(shù),你可以檢索具有該名字的日志。如果LogManager.GetLogger(…)打開(kāi)的不是預(yù)定義的日志對(duì)象,則該日志對(duì)象會(huì)繼承根日志對(duì)象的屬性。知道了這一點(diǎn),我們可以說(shuō),其實(shí)<logger>標(biāo)簽并不是必須的。

 

 

(3) <appender>

 

 

  1. <appender name="LogFileAppender"   
  2. type="log4net.Appender.FileAppender" > 
  3. <param name="File" value="log-file.txt" /> 
  4. <param name="AppendToFile" value="true" /> 
  5. <layout type="log4net.Layout.PatternLayout"> 
  6. <param name="Header" value="[Header]\r\n" /> 
  7. <param name="Footer" value="[Footer]\r\n"/> 
  8. <param name="ConversionPattern"   
  9. value="%d [%t] %-5p %c - %m%n"   
  10. /> 
  11. </layout> 
  12. <filter type="log4net.Filter.LevelRangeFilter"> 
  13. <param name="LevelMin" value="DEBUG" /> 
  14. <param name="LevelMax" value="WARN" /> 
  15. </filter> 
  16. </appender> 

 

 

在<root>標(biāo)簽或單個(gè)的<logger>標(biāo)簽里的Appender對(duì)象可以用<appender>標(biāo)簽定義。<appender>標(biāo)簽的基本形式如上面所示。它定義了appender的名字和類(lèi)型。另外比較重要的是<appender>標(biāo)簽內(nèi)部的其他標(biāo)簽。不同的appender有不同的<param>標(biāo)簽。在這里,為了使用FileAppender,你需要一個(gè)文件名作為參數(shù)。另外還需要一個(gè)在<appender>標(biāo)簽內(nèi)部定義一個(gè)Layout對(duì)象。Layout對(duì)象定義在它自己的<layout>標(biāo)簽內(nèi)。<layout>標(biāo)簽的type屬性定義了Layout的類(lèi)型(在本例里是PatternLayout),同時(shí)也確定了需要提供的參數(shù)值。Header和Footer標(biāo)簽提供了一個(gè)日志會(huì)話(logging session)開(kāi)始和結(jié)束時(shí)輸出的文字。有關(guān)每種appender的具體配置的例子,可以在log4net\doc\manual\example-config-appender.html中得到。

 

(4) log4net.Layout.PatternLayout中的轉(zhuǎn)換模式(ConversionPattern)

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

%n(new line):換行

%d(datetime):輸出當(dāng)前語(yǔ)句運(yùn)行的時(shí)刻

%r(run time):輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語(yǔ)句時(shí)消耗的毫秒數(shù)

%t(thread id):當(dāng)前語(yǔ)句所在的線程ID

%p(priority): 日志的當(dāng)前優(yōu)先級(jí)別,即DEBUG、INFO、WARN…等

%c(class):當(dāng)前日志對(duì)象的名稱(chēng),例如:

模式字符串為:%-10c -%m%n

代碼為:

ILog log=LogManager.GetLogger(“Exam.Log”);

log.Debug(“Hello”);

則輸出為下面的形式:

Exam.Log - Hello

%L:輸出語(yǔ)句所在的行號(hào)

%F:輸出語(yǔ)句所在的文件名

%-數(shù)字:表示該項(xiàng)的最小長(zhǎng)度,如果不夠,則用空格填充

例如,轉(zhuǎn)換模式為%r [%t]%-5p %c - %m%n 的 PatternLayout 將生成類(lèi)似于以下內(nèi)容的輸出:

176 [main] INFO org.foo.Bar - Located nearest gas station.

 

(5) <filter>

最后,讓我們看看在Appender元素里的<filter>標(biāo)簽。它定義了應(yīng)用到Appender對(duì)象的過(guò)濾器。本例中,我們使用了LevelRangeFilter過(guò)濾器,它可以只記錄LevelMin和LevelMax參數(shù)指定的日志級(jí)別之間的日志事件。可以在一個(gè)Appender上定義多個(gè)過(guò)濾器(Filter),這些過(guò)濾器將會(huì)按照它們定義的順序?qū)θ罩臼录M(jìn)行過(guò)濾。其他過(guò)濾器的有關(guān)信息可以在log4net的SDK文檔中找到。

 

5  使用配置文件

(1)關(guān)聯(lián)配置文件

當(dāng)我們創(chuàng)建了上面的配置文件后,我們接下來(lái)需要把它和我們的應(yīng)用聯(lián)系起來(lái)。缺省的,每個(gè)獨(dú)立的可執(zhí)行程序集都會(huì)定義它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的級(jí)別上定義配置文件。

例如:可以在項(xiàng)目的AssemblyInfo.cs文件里添加以下的語(yǔ)句

 

  1. [assembly:log4net.Config.DOMConfigurator(ConfigFile="filename",   
  2. ConfigFileExtension="ext",Watch=true/false)] 

 

ConfigFile:指出了我們的配置文件的路徑及文件名,包括擴(kuò)展名。

ConfigFileExtension:如果我們對(duì)被編譯程序的程序集使用了不同的文件擴(kuò)展名,那么我們需要定義這個(gè)屬性,缺省的,程序集的配置文件擴(kuò)展名為”config”。

Watch (Boolean屬性): log4net框架用這個(gè)屬性來(lái)確定是否需要在運(yùn)行時(shí)監(jiān)視文件的改變。如果這個(gè)屬性為true,那么FileSystemWatcher將會(huì)被用來(lái)監(jiān)視文件的改變,重命名,刪除等事件。

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

ConfigFileExtension則是指明了和可執(zhí)行程序集同名的配置文件的擴(kuò)展名,例如,應(yīng)用程序的名稱(chēng)是”test.exe”,ConfigFileExtension=”txt”,則配置文件就應(yīng)該是”test.exe.txt” ;

也可以不帶參數(shù)應(yīng)用DOMConfiguratio():

 

  1. [assembly: log4net.Config.DOMConfigurator()] 

 

也可以在程序代碼中用DOMConfigurator類(lèi)打開(kāi)配置文件。類(lèi)的構(gòu)造函數(shù)需要一個(gè)FileInfo對(duì)象作參數(shù),以指出要打開(kāi)的配置文件名。這個(gè)方法和前面在程序集里設(shè)置屬性打開(kāi)一個(gè)配置文件的效果是一樣的。

 

  1. log4net.Config.DOMConfigurator.Configure(  
  2. new FileInfo("TestLogger.Exe.Config"));  

 

DOMConfigurator 類(lèi)還有一個(gè)方法ConfigureAndWatch(..), 用來(lái)配置框架并檢測(cè)文件的變化。

以上的步驟總結(jié)了和配置相關(guān)的各個(gè)方面,下面我們將分兩步來(lái)使用logger對(duì)象。

(2)創(chuàng)建或獲取日志對(duì)象

日志對(duì)象會(huì)使用在配置文件里定義的屬性。如果某個(gè)日志對(duì)象沒(méi)有事先在配置文件里定義,那么框架會(huì)根據(jù)繼承結(jié)構(gòu)獲取祖先節(jié)點(diǎn)的屬性,最終的,會(huì)從根日志獲取屬性。如下所示:

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

(3) 輸出日志信息

可以使用ILog的幾種方法輸出日志信息。你也可以在調(diào)用某方法前先檢查IsXXXEnabled布爾變量,再?zèng)Q定是否調(diào)用輸出日志信息的函數(shù),這樣可以提高程序的性能。因?yàn)榭蚣茉谡{(diào)用如ILog.Debug(…)這樣的函數(shù)時(shí),也會(huì)先判斷是否滿足Level日志級(jí)別條件。

 

  1. if (log.IsDebugEnabled) log.Debug("message");  
  2. if (log.IsInfoEnabled) log.Info("message); 

 

 

6  在程序中配置log4net

除了前面講的用一個(gè)配置文件來(lái)配置log4net以外,還可以在程序中用代碼來(lái)配置log4net框架。如下面的例子:

 

 

  1. // 和PatternLayout一起使用FileAppender   
  2. log4net.Config.BasicConfigurator.Configure(  
  3. new log4net.Appender.FileAppender(  
  4. new log4net.Layout.PatternLayout("%d   
  5. [%t]%-5p %c [%x] - %m%n"),"testfile.log"));  
  6. // using a FileAppender with an XMLLayout  
  7. log4net.Config.BasicConfigurator.Configure(   
  8. new log4net.Appender.FileAppender(   
  9. new log4net.Layout.XMLLayout(),"testfile.xml"));  
  10. // using a ConsoleAppender with a PatternLayout  
  11. log4net.Config.BasicConfigurator.Configure(   
  12. new log4net.Appender.ConsoleAppender(  
  13. new log4net.Layout.PatternLayout("%d   
  14. [%t] %-5p %c - %m%n")));  
  15. // using a ConsoleAppender with a SimpleLayout  
  16. log4net.Config.BasicConfigurator.Configure(  
  17. new log4net.Appender.ConsoleAppender(new   
  18. log4net.Layout.SimpleLayout())); 

 

盡管這里用代碼配置log4net也很方便,但是你卻不能分別配置每個(gè)日志對(duì)象。所有的這些配置都是被應(yīng)用到根日志上的。

log4net.Config.BasicConfigurator 類(lèi)使用靜態(tài)方法Configure 設(shè)置一個(gè)Appender 對(duì)象。而Appender的構(gòu)造函數(shù)又會(huì)相應(yīng)的要求Layout對(duì)象。你也可以不帶參數(shù)直接調(diào)用BasicConfigurator.Configure(),它會(huì)使用一個(gè)缺省的PatternLayout對(duì)象,在一個(gè)ConsoleAppender中輸出信息。如下所示:

 

 

  1. log4net.Config.BasicConfigurator.Configure(); 

 

在輸出時(shí)會(huì)顯示如下格式的信息:

 

0 [1688] DEBUG log1 A B C - Test

20 [1688] INFO log1 A B C - Test

當(dāng)log4net框架被配置好以后,就可以如前所述使用日志功能了。

 

 

總結(jié)

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

【編輯推薦】

  1. c#.net實(shí)體類(lèi)序列化方法
  2. 對(duì)象的序列化和反序列化
  3. 用C#實(shí)現(xiàn)文件夾拷貝
  4. C#中自增、自減操作符重載是個(gè)怎么回事兒
  5. 解析C#委托、時(shí)間和Lambda表達(dá)式
責(zé)任編輯:于鐵 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-01 15:54:41

log4net

2009-10-26 19:22:29

VB.NET使用Log

2009-08-24 18:14:35

ASP.NET調(diào)試Log4net

2009-08-25 16:54:28

C# RichText

2024-05-21 11:09:17

2024-12-04 08:17:49

日志框架NLog

2009-08-28 16:31:21

C# treeview

2009-08-28 17:01:43

C#構(gòu)造函數(shù)

2009-09-08 14:54:40

C# listBox控

2024-11-12 07:28:39

2009-09-01 15:25:04

C# default關(guān)

2009-07-27 14:13:56

調(diào)用c#方法Java scriptASP.NET

2011-07-19 17:18:35

Objective-C Property

2011-08-02 15:55:31

Objective-C NSAutorele

2023-12-25 08:55:35

.NET日志框架Serilog

2024-03-06 09:24:50

AsyncAwaitC#

2010-02-02 09:32:32

C++ typedef

2011-08-19 13:51:12

2009-08-21 16:35:08

使用C#結(jié)合ADO.N

2010-01-26 17:35:09

C++棧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩免费av | 在线日韩视频 | 亚洲精品一区二区在线观看 | 亚洲精品一区二区冲田杏梨 | 国产精华一区 | 国产精品美女在线观看 | 国产 欧美 日韩 一区 | 久久久久久高潮国产精品视 | 欧美精品久久久 | 久久久不卡网国产精品一区 | aaa一区| 黄色毛片在线看 | 精品久久香蕉国产线看观看亚洲 | 午夜精品影院 | 久久草视频 | 国产在线中文字幕 | 成人片免费看 | 国产91在线精品 | 在线91 | 国产特一级黄色片 | 日韩综合色 | 操久久 | 午夜精品一区二区三区免费视频 | 国产精品国产a | 日本午夜在线视频 | 久久久网 | 久久91精品国产 | 精品日韩| 国产免费又色又爽又黄在线观看 | 国产乱xxav | 久久久久免费 | 国产精品1区2区3区 欧美 中文字幕 | 亚洲精品一区二区三区在线 | 欧美视频日韩 | 午夜天堂精品久久久久 | 国产一区二区精品在线 | av一级久久 | 久久一区二区三区四区 | 中文字幕在线剧情 | 黑人一级片视频 | 91社区在线观看播放 |