麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

C#關(guān)于log4net(LogForNet)

2019-11-14 14:07:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1       介紹

log4net(Log For Net)是Apache開(kāi)源的應(yīng)用于.Net框架的日志記錄工具,詳細(xì)信息參見(jiàn)Apache網(wǎng)站.它是針對(duì)java的log4j(Log For Java的)姊妹工具.用過(guò)log4j的都知道,它功能強(qiáng)大,可配置性靈活,線程安全,對(duì)日志的輸出管理和級(jí)別管理方便。具體的使用方法往下看。

首先你應(yīng)該下載log4net.dll并引入到你的項(xiàng)目References中,或者把源代碼項(xiàng)目作為你工程的一部分加入到你的工程當(dāng)中。單擊這里下載Log4net 。

使用log4net需要知道其中兩個(gè)比較重要的概念:logger 和 appender。前者是日志記錄對(duì)象,后者是日志記錄的目標(biāo),包括控制臺(tái),文件,定量大小的文件,遠(yuǎn)程廣播。也就是說(shuō)我們使用log4net的過(guò)程可以是這樣的:獲得一個(gè)用來(lái)記錄日志的工具對(duì)象logger,然后為logger對(duì)象指定日志的記錄位置.美妙的是,這一切工作都可以在Web.config配置文件中完成,所用的代碼極少。

1.1 優(yōu)點(diǎn)

幾乎所有的大型應(yīng)用都會(huì)有自己的用于跟蹤調(diào)試的API。因?yàn)橐坏┏绦虮徊渴鹨院螅筒惶赡茉倮脤?zhuān)門(mén)的調(diào)試工具了。然而一個(gè)管理員可能需要有一套強(qiáng)大的日志系統(tǒng)來(lái)診斷和修復(fù)配置上的問(wèn)題。

經(jīng)驗(yàn)表明,日志記錄往往是軟件開(kāi)發(fā)周期中的重要組成部分。它具有以下幾個(gè)優(yōu)點(diǎn):它可以提供應(yīng)用程序運(yùn)行時(shí)的精確環(huán)境,可供開(kāi)發(fā)人員盡快找到應(yīng)用程序中的Bug;一旦在程序中加入了Log 輸出代碼,程序運(yùn)行過(guò)程中就能生成并輸出日志信息而無(wú)需人工干預(yù)。另外,日志信息可以輸出到不同的地方(控制臺(tái),文件等)以備以后研究之用。

Log4net就是為這樣一個(gè)目的設(shè)計(jì)的,用于.NET開(kāi)發(fā)環(huán)境的日志記錄包。

1.2安裝

用戶(hù)要在自己的程序里加入日志功能,只需將log4net.dll引入工程即可。

1.3結(jié)構(gòu)

log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫(kù)), Appender(附著器)以及 Layout(布局)。

1.4Logger接口

Logger是應(yīng)用程序需要交互的主要組件,它用來(lái)產(chǎn)生日志消息。產(chǎn)生的日志消息并不直接顯示,還要預(yù)先經(jīng)過(guò)Layout的格式化處理后才會(huì)輸出。

Logger提供了多種方式來(lái)記錄一個(gè)日志消息,你可以在你的應(yīng)用程序里創(chuàng)建多個(gè)Logger,每個(gè)實(shí)例化的Logger對(duì)象都被log4net框架作為命名實(shí)體(named entity)來(lái)維護(hù)。這意味著為了重用Logger對(duì)象,你不必將它在不同的類(lèi)或?qū)ο箝g傳遞,只需要用它的名字為參數(shù)調(diào)用就可以了。log4net框架使用繼承體系,繼承體系類(lèi)似于.NET中的名字空間。也就是說(shuō),如果有兩個(gè)logger,分別被定義為a.b.c和a.b,那么我們說(shuō)a.b是a.b.c的祖先。每一個(gè)logger都繼承了祖先的屬性

Log4net框架定義了一個(gè)ILog接口,所有的logger類(lèi)都必須實(shí)現(xiàn)這個(gè)接口。如果你想實(shí)現(xiàn)一個(gè)自定義的logger,你必須首先實(shí)現(xiàn)這個(gè)接口。你可以參考在/extension目錄下的幾個(gè)例子。

ILog接口的定義如下:

public interface ILog

{

  void Debug(object message);

  void Info(object message);

  void Warn(object message);

  void Error(object message);

  void Fatal(object message);

//以上的每一個(gè)方法都有一個(gè)重載的方法,用來(lái)支持異常處理。

//每一個(gè)重載方法都如下所示,有一個(gè)異常類(lèi)型的附加參數(shù)。

  void Debug(object message, Exception ex);

  // ...

//Boolean 屬性用來(lái)檢查L(zhǎng)ogger的日志級(jí)別

//(我們馬上會(huì)在后面看到日志級(jí)別)

 bool isDebugEnabled;

  bool isInfoEnabled;

  //… 其他方法對(duì)應(yīng)的Boolean屬性

}

Log4net框架定義了一個(gè)叫做LogManager的類(lèi),用來(lái)管理所有的logger對(duì)象。它有一個(gè)GetLogger()靜態(tài)方法,用我們提供的名字參數(shù)來(lái)檢索已經(jīng)存在的Logger對(duì)象。如果框架里不存在該Logger對(duì)象,它也會(huì)為我們創(chuàng)建一個(gè)Logger對(duì)象。代碼如下所示:

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");

通常來(lái)說(shuō),我們會(huì)以類(lèi)(class)的類(lèi)型(type)為參數(shù)來(lái)調(diào)用GetLogger(),以便跟蹤我們正在進(jìn)行日志記錄的類(lèi)。傳遞的類(lèi)(class)的類(lèi)型(type)可以用typeof(Classname)方法來(lái)獲得,或者可以用如下的反射方法來(lái)獲得:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType

盡管符號(hào)長(zhǎng)了一些,但是后者可以用于一些場(chǎng)合,比如獲取調(diào)用方法的類(lèi)(class)的類(lèi)型(type)。

正如你在ILog的接口中看到的一樣,有五種不同的方法可以跟蹤一個(gè)應(yīng)用程序。事實(shí)上,這五種方法是運(yùn)作在Logger對(duì)象設(shè)置的不同日志優(yōu)先級(jí)別上。這幾種不同的級(jí)別是作為常量定義在log4net.spi.Level類(lèi)中。你可以在程序中使用任何一種方法。但是在最后的發(fā)布中你也許不想讓所有的代碼來(lái)浪費(fèi)你的CPU周期,因此,框架提供了7種級(jí)別和相應(yīng)的Boolean屬性來(lái)控制日志記錄的類(lèi)型。

Level有以下幾種取值

級(jí)別

允許的方法

Boolean屬性

優(yōu)先級(jí)別

OFF

 

 

Highest

FATAL

void Fatal(...);

bool IsFatalEnabled;

 

RROR

void Error(...);

bool IsErrorEnabled;

 

WARN

void Warn(...);

bool IsWarnEnabled;

 

INFO

void Info(...);

bool IsInfoEnabled;

 

DEBUG

void Debug(...);

bool IsDebugEnabled;

 

ALL

 

 

Lowest

 

在log4net框架里,通過(guò)設(shè)置配置文件,每個(gè)日志對(duì)象都被分配了一個(gè)日志優(yōu)先級(jí)別。如果沒(méi)有給一個(gè)日志對(duì)象顯式地分配一個(gè)級(jí)別,那么該對(duì)象會(huì)試圖從他的祖先繼承一個(gè)級(jí)別值。

ILog接口的每個(gè)方法都有一個(gè)預(yù)先定義好了的級(jí)別值。正如你在表1看到的,ILog的Inof()方法具有INFO級(jí)別。同樣的,以此類(lèi)推,Error()方法具有ERROR級(jí)別。當(dāng)我們使用以上的任何一種方法時(shí),log4net框架會(huì)檢查日志對(duì)象logger的級(jí)別和方法的級(jí)別。只有當(dāng)方法的級(jí)別高于日志級(jí)別時(shí),日志請(qǐng)求才會(huì)被接受并執(zhí)行。

舉例說(shuō)明,當(dāng)你創(chuàng)建了一個(gè)日志對(duì)象,并且把他的級(jí)別設(shè)置為INFO。于是框架會(huì)設(shè)置日志的每個(gè)Boolean屬性。當(dāng)你調(diào)用相應(yīng)的日志方法時(shí),框架會(huì)檢查相應(yīng)的Boolean屬性,以決定該方法能不能執(zhí)行。如下的代碼:

Logger.Info("message");

Logger.Debug("message");

Logger.Warn("message");

對(duì)于第一種方法,Info()的級(jí)別等與日志的級(jí)別(INFO),因此日志請(qǐng)求會(huì)被傳遞,我們可以得到輸出結(jié)果”message”。

對(duì)于第二種方法,Debug()的級(jí)別低于日志對(duì)象logger的日志級(jí)別(INFO),因此,日志請(qǐng)求被拒絕了,我們得不到任何輸出。同樣的,針對(duì)第三行語(yǔ)句,我們可以很容易得出結(jié)論。

在表1中有兩個(gè)特殊的級(jí)別:ALL和OFF。ALL表示允許所有的日志請(qǐng)求。OFF是拒絕所有的請(qǐng)求。

你也可以顯式地檢查L(zhǎng)ogger對(duì)象的Boolean屬性,如下所示:

if (logger.IsDebugEnabled)

{

  Logger.Debug("message");

}

1.5Repository接口

Repository主要用于負(fù)責(zé)日志對(duì)象組織結(jié)構(gòu)的維護(hù)。在log4net的以前版本中,框架僅支持分等級(jí)的組織結(jié)構(gòu)(hierarchical organization)。這種等級(jí)結(jié)構(gòu)本質(zhì)上是庫(kù)的一個(gè)實(shí)現(xiàn),并且定義在log4net.Repository.Hierarchy 名字空間中。要實(shí)現(xiàn)一個(gè)Repository,需要實(shí)現(xiàn)log4net.Repository.ILoggerRepository 接口。但是通常并不是直接實(shí)現(xiàn)該接口,而是以log4net.Repository.LoggerRepositorySkeleton為基類(lèi)繼承。體系庫(kù) (hierarchical repository )則由log4net.Repository.Hierarchy.Hierarchy類(lèi)實(shí)現(xiàn)。

如果你是個(gè)log4net框架的使用者,而非擴(kuò)展者,那么你幾乎不會(huì)在你的代碼里用到Repository的類(lèi)。相反的,你需要用到LogManager類(lèi)來(lái)自動(dòng)管理庫(kù)和日志對(duì)

1.6Appender

一個(gè)好的日志框架應(yīng)該能夠產(chǎn)生多目的地的輸出。比如說(shuō)輸出到控制臺(tái)或保存到一個(gè)日志文件。log4net 能夠很好的滿(mǎn)足這些要求。它使用一個(gè)叫做Appender的組件來(lái)定義輸出介質(zhì)。正如名字所示,這些組件把它們附加到Logger日志組件上并將輸出傳遞到輸出流中。你可以把多個(gè)Appender組件附加到一個(gè)日志對(duì)象上。 Log4net框架提供了幾個(gè)Appender組件。關(guān)于log4net提供的Appender組件的完整列表可以在log4net框架的幫助手冊(cè)中找到。有了這些現(xiàn)成的Appender組件,一般來(lái)說(shuō)你沒(méi)有必要再自己編寫(xiě)了。但是如果你愿意,可以從log4net.Appender.AppenderSkeleton類(lèi)繼承。

2       配置說(shuō)明

先在web.config中的<configuration>節(jié)點(diǎn)下添加如下配置:

<configSections>

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

</configSections>

還應(yīng)該配置log4net節(jié)點(diǎn),接下來(lái)在<configuration>節(jié)點(diǎn)下添加如下log4net節(jié)點(diǎn)配置:

<log4net>   

    <root>

      <level value=" DEBUG" />

      <appender-ref ref="LogFileAppender" />

      <appender-ref ref="ConsoleAppender" />

    </root>

    <logger name="testApp.Logging">

      <level value="DEBUG"/>

    </logger>

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

      <param name="File" value="c://log-file.txt" />

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

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

        <param name="Header" value="[Header]/r/n"/>

        <param name="Footer" value="[Footer]/r/n"/>

        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x]  - %m%n"     />

      </layout>

      <filter type="log4net.Filter.LevelRangeFilter">

        <param name="LevelMin" value="DEBUG" />

        <param name="LevelMax" value="WARN" />

      </filter>

    </appender>

 

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

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

        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />

      </layout>

    </appender>

 

  </log4net>

從上面的配置中可以看到定義了多個(gè)appender,每一個(gè)appender就是一個(gè)日志記錄的目標(biāo)。root節(jié)點(diǎn)指定了選用哪一個(gè) appender. 在這里我選用了LogFileAppender。到這里配置就基本上完成了,但是怎么使用上面的配置呢?log4net為我們提供了在應(yīng)用程序啟動(dòng)時(shí)加載配置信息的入口,很簡(jiǎn)單,在Global.asax.cs的application_Start過(guò)程中添加如下代碼:

log4net.Config.DOMConfigurator.Configure();

好了,到此為止整個(gè)配置過(guò)程完成了,下面是怎么調(diào)用的問(wèn)題了

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ǔ)句

[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename",

 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():

 [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è)配置文件的效果是一樣的。

log4net.Config.DOMConfigurator.Configure( 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ì)先判斷是否滿(mǎn)足Level日志級(jí)別條件。

if (log.IsDebugEnabled) log.Debug("message");

if (log.IsInfoEnabled) log.Info("message);

4、  在程序中配置log4net

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

// 和PatternLayout一起使用FileAppender

log4net.Config.BasicConfigurator.Configure(

  new log4net.Appender.FileAppender(

     new log4net.Layout.PatternLayout("%d

       [%t]%-5p %c [%x] - %m%n"),"testfile.log"));

// using a FileAppender with an xmlLayout

log4net.Config.BasicConfigurator.Configure(

  new log4net.Appender.FileAppender(

    new log4net.Layout.XMLLayout(),"testfile.xml"));

// using a ConsoleAppender with a PatternLayout

log4net.Config.BasicConfigurator.Configure(

 new log4net.Appender.ConsoleAppender(

    new log4net.Layout.PatternLayout("%d

      [%t] %-5p %c - %m%n")));

 

// using a ConsoleAppender with a SimpleLayout

log4net.Config.BasicConfigurator.Configure(

  new log4net.Appender.ConsoleAppender(new

    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中輸出信息。如下所示:

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框架被配置好以后,就可以如前所述使用日志功能了。

3       調(diào)用

新建一個(gè)log4nettest.aspx頁(yè)面,在cs文件中添加引用 using log4net;定義本頁(yè)的一個(gè)全局變量:PRivate static readonly ILog log = LogManager.GetLogger(typeof(log4nettest));

然后在Page_Load中添加如下代碼:log.Debug("這是我在使用Log4Net");運(yùn)行該頁(yè)面,在C:/下面會(huì)生成一個(gè)c://log-file.tx文本文件,打開(kāi)看看,里面就有你寫(xiě)入的日志。

在Global.asax添加如下的內(nèi)容:

void Application_Start(object sender, EventArgs e)

    {

        // Code that runs on application startup

        log4net.Config.DOMConfigurator.Configure();

}

        實(shí)例

簡(jiǎn)單的使用步驟:

1。下載log4net.dll,并在項(xiàng)目中引用。

2。配置log4net.xml,想要根據(jù)具體要求修改的話(huà),請(qǐng)參照文獻(xiàn)查找各個(gè)參數(shù)的含義。

 

[html] view plaincopyprint?
 
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.  <configSections>  
  4.   <section   name="log4net"   type="System.Configuration.IgnoreSectionHandler"   />  
  5.  </configSections>  
  6.  <log4net>  
  7.     <!--   Define   some   output   appenders   -->  
  8.     <appender   name="LogFileAppender"   type="log4net.Appender.FileAppender">  
  9.       <param   name="File"   value="log-file.txt"   />  
  10.       <!--   Example   using   environment   variables   in   params   -->  
  11.       <!--   <param   name="File"   value="${TMP}//log-file.txt"   />   -->  
  12.       <param   name="AppendToFile"   value="true"   />  
  13.       <!--   An   alternate   output   encoding   can   be   specified   -->  
  14.       <!--   <param   name="Encoding"   value="unicodeFFFE"   />   -->  
  15.       <layout   type="log4net.Layout.PatternLayout">  
  16.         <param   name="Header"   value="[Header]/r/n"   />  
  17.         <param   name="Footer"   value="[Footer]/r/n"   />  
  18.         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x]  - %m%n"     />  
  19.       </layout>  
  20.       <!--   Alternate   layout   using   XML           
  21.         <layout   type="log4net.Layout.XMLLayout"   />   -->  
  22.     </appender>  
  23.     <!--   Setup   the   root   category,   add   the   appenders   and   set   the   default   level   -->  
  24.     <root>  
  25.       <level   value="ALL"   />  
  26.       <appender-ref   ref="LogFileAppender"   />  
  27.       <!--   <appender-ref   ref="A"   />   -->  
  28.     </root>  
  29.     <!--   Specify   the   level   for   some   specific   categories   -->  
  30.     <logger   name="SLog4net.Form1">  
  31.       <!--   <appender-ref   ref="B"   />   -->  
  32.       <level   value="ALL"   />  
  33.       <appender-ref   ref="LogFileAppender"   />  
  34.     </logger>  
  35.   </log4net>  
  36.  </configuration>  
<?xml version="1.0" encoding="utf-8" ?><configuration> <configSections>  <section   name="log4net"   type="System.Configuration.IgnoreSectionHandler"   /> </configSections> <log4net>    <!--   Define   some   output   appenders   -->    <appender   name="LogFileAppender"   type="log4net.Appender.FileAppender">      <param   name="File"   value="log-file.txt"   />      <!--   Example   using   environment   variables   in   params   -->      <!--   <param   name="File"   value="${TMP}//log-file.txt"   />   -->      <param   name="AppendToFile"   value="true"   />      <!--   An   alternate   output   encoding   can   be   specified   -->      <!--   <param   name="Encoding"   value="unicodeFFFE"   />   -->      <layout   type="log4net.Layout.PatternLayout">        <param   name="Header"   value="[Header]/r/n"   />        <param   name="Footer"   value="[Footer]/r/n"   />        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x]  - %m%n"     />      </layout>      <!--   Alternate   layout   using   XML                 <layout   type="log4net.Layout.XMLLayout"   />   -->    </appender>    <!--   Setup   the   root   category,   add   the   appenders   and   set   the   default   level   -->    <root>      <level   value="ALL"   />      <appender-ref   ref="LogFileAppender"   />      <!--   <appender-ref   ref="A"   />   -->    </root>    <!--   Specify   the   level   for   some   specific   categories   -->    <logger   name="SLog4net.Form1">      <!--   <appender-ref   ref="B"   />   -->      <level   value="ALL"   />      <appender-ref   ref="LogFileAppender"   />    </logger>  </log4net> </configuration>

 

記得:如果是web程序要將log4net.xml放到根目錄下面,如果是winform要將log4net.xml放到啟動(dòng)目錄下面。

3.在項(xiàng)目的AssemblyInfo .cs中添加

[assembly: log4net.Config.DOMConfigurator(ConfigFile = "log4net.xml", Watch = true)]

 

4.在類(lèi)中調(diào)用。

新建一個(gè)Form1的Windows窗體,在cs文件中添加引用 using log4net;定義本頁(yè)的一個(gè)全局變量:private static readonly ILog log = LogManager.GetLogger(typeof(Form1));

然后在Page_Load中添加如下代碼:log.Debug("這是我在使用Log4Net");運(yùn)行該頁(yè)面,在項(xiàng)目下面會(huì)生成一個(gè)log-file.txt文本文件,打開(kāi)看看,里面就有你寫(xiě)入的日志。

 


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: www.91操 | 国产精品免费视频观看 | 免费看真人a一级毛片 | 在线1区 | 牛牛热这里只有精品 | 成人免费毛片片v | 亚洲成人精品一区二区 | 成人免费国产 | 亚洲一区二区三区日本久久九 | 欧美日韩大片在线观看 | www.99av | 97青青| 202z中文字幕第一页 | 免费在线观看亚洲 | 亚洲最大久久 | 蜜桃网站在线观看 | 亚州综合一区 | 久久久久亚洲国产精品 | 久久国产免费视频 | 久久影院免费观看 | 黄在线免费 | 18pao国产成人免费视频 | 黄色片网站免费在线观看 | 热久久91 | 久久国产成人精品国产成人亚洲 | 国产精品久久久久久久久粉嫩 | 一级性色| 男女羞羞视频在线观看免费 | 最近日本电影hd免费观看 | 2021国产精品视频 | 巨乳毛片 | 国产一级毛片视频在线! | 国产精品一区二区x88av | 久久国产成人精品国产成人亚洲 | 国产精品久久久久网站 | 草草视频免费观看 | 亚洲成人免费网站 | 91成人久久 | 亚洲午夜国产 | 欧美一级黄色影院 | 免费看成人av |