程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Log4net,c#log4net

Log4net,c#log4net

編輯:C#入門知識

Log4net,c#log4net


之前對於配置並沒有結束, 中間插了一個demo進去, 能夠更直觀的看到日志是怎麼使用的. 這一篇, 我加了一些自己的東西進去, 可以更直觀的來理解這些配置內容.

這裡就繼續介紹配置文件中的內容.

1. <log4net> 標簽

<log4net debug="true"></log4net>

支持的屬性:

debug 可選,取值是true或false,默認是false。設置為true,開啟log4net的內部調試。 update 可選,取值是Merge(合並)或Overwrite(覆蓋),默認值是Merge。設置為Overwrite,在提交配置的時候會重置已經配置過的庫。 threshold 可選,取值是repository(庫)中注冊的level,默認值是ALL。

支持的元素:

appender 0或多個 logger 0或多個 renderer 0或多個 root 最多一個 param 0或多個

 

2. <root>標簽

<root>
  <level value="ALL" />
  <appender-ref ref="ErrorLogFileAppender" />
  <appender-ref ref="TraceLogFileAppender" />
</root>

根元素, 其他所有的logger都默認繼承他, root沒有屬性

支持的子元素:

appender-ref 0個或多個,要引用的appender的名字。 level

最多一個。 只有在這個級別或之上的事件才會被記錄。

OFF / FATAL / ERROR / WARN / INFO / DEBUG  / ALL 

param 0個或多個, 設置一些參數。

 

3. <logger>標簽

從上一篇的例子中, 其實是找不到logger標簽的, 如果只是簡單的記錄日志, 其實並不需要使用到這個標簽

支持的屬性:

name 必須的,logger的名稱 additivity 可選,取值是true或false,默認值是true。設置為false時將阻止父logger中的appender。

支持的子元素:

appender-ref 0個或多個,要引用的appender的名字。 level 最多一個。 只有在這個級別或之上的事件才會被記錄。 param 0個或多個, 設置一些參數。

 

4. <appender>標簽

<appender name="TraceLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="Logs\Trace\" />
  <appendToFile value="true" />
  <MaxSizeRollBackups value="20" />
  <RollingStyle value="Date" />
  <DatePattern value="yyyy-MM-dd'.txt'" />
  <StaticLogFileName value="false" />
  <!--<MaximumFileSize  value="10MB"/>-->
  <layout type="log4net.Layout.PatternLayout,log4net">
    <header value="[BEGIN LOGGING AT %date]%newline" type="log4net.Util.PatternString" />
    <ConversionPattern value="%d [%t] %-5p %c - %m%n" />
    <footer value="[END LOGGING AT %date]%newline%newline" type="log4net.Util.PatternString" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter,log4net">
    <levelMin value="DEBUG" />
    <levelMax value="INFO" />
  </filter>
</appender>

定義日志的輸出方式,只能作為 log4net 的子元素。name屬性必須唯一,type屬性必須指定。

支持的屬性:

name 必須的,Appender對象的名稱 type 必須的,Appender對象的輸出類型

支持的子元素:

appender-ref 0個或多個,允許此appender引用其他appender,並不是所以appender類型都支持。 filter 0個或多個,定義此app使用的過濾器。 layout 最多一個。定義appender使用的輸出格式。 param 0個或多個, 設置Appender類中對應的屬性的值。

 

實際上<appender>所能包含的子元素遠不止上面4個。

在我過去的項目中, 常用的也就兩種, 一種是寫入文件中, 另一種是寫入數據庫中. 對於發送到郵件中的, 暫時還沒有使用過. 那就主要介紹下前面兩種方式吧.

4.1 寫入文件中

寫入文件中, 各人習慣可能有些不一樣, 當然也是與項目相關的. 有些人喜歡按照日期來存, 有些人喜歡放入一個文件中, 設置最大存儲值來存. 都是可以的. 如果項目日志文件多, 可以分日期, 如果項目日志文件少, 那麼分日期, 就不合算了, 可能會導致文件和日志一樣多.

1). 日期方式

<appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <!--文件目錄或者文件名-->
  <file value="Logs\Error\" />
    <!--為true時, 日志文件只取file的名字; 為false時, 日志文件取名規則為 file+DatePattern-->
  <StaticLogFileName value="false" />
  <!--文件名格式-->
  <DatePattern value="yyyy-MM-dd'.txt'" />
  <!--記錄日志的形式, Date/Size 兩種, 此處表示按日期記錄日志-->
  <RollingStyle value="Date" />
  <!--是否追加到日志中, 默認為true, 無需設置-->
  <appendToFile value="true" />
  <layout type="log4net.Layout.PatternLayout,log4net">
    <header value="[BEGIN LOGGING AT %date]%newline" type="log4net.Util.PatternString" />
    <ConversionPattern value="%d [%t] %-5p %c - %m%n" />
    <footer value="[END LOGGING AT %date]%newline%newline" type="log4net.Util.PatternString" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter,log4net">
    <levelMin value="ERROR" />
    <levelMax value="FATAL" />
  </filter>
</appender>

日期方式, 要注意的幾個地方, 我在上面用背景色標注出來了.

 

2). 文件大小限制方式

<appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="Logs\Error.log" />
  <RollingStyle value="Size" />
  <!--文件夾下記錄的日志文件個數, 需要與MaximumFileSize配合使用-->
  <MaxSizeRollBackups value="2" />
  <!--每個日志文件大小, 不能為小數, 如果這裡限制100kb, 但是需要記錄的內容有150kb, 會全部記錄的-->
  <!--可用單位 : KB / MB / GB -->
  <MaximumFileSize  value="100KB"/>
  <StaticLogFileName value="true" />
  <appendToFile value="true" />
  <layout type="log4net.Layout.PatternLayout,log4net">
    <header value="[BEGIN LOGGING AT %date]%newline" type="log4net.Util.PatternString" />
    <ConversionPattern value="%d [%t] %-5p %c - %m%n" />
    <footer value="[END LOGGING AT %date]%newline%newline" type="log4net.Util.PatternString" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter,log4net">
    <levelMin value="ERROR" />
    <levelMax value="FATAL" />
  </filter>
</appender>

從上面的配置看到, 文件夾下能建的日志文件是可以限制的, 那麼如果滿了怎麼辦? log4net 不會再創建新文件了, 而是重寫的方式去記錄日志. 換句通俗的說法, 就是在這幾個文件裡面轉圈圈.

 

4.2 寫入數據庫中

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="ADONetAppender" />
  </root>

  <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
    <!--緩存條數, 一次性寫入數據庫, 調試時, 此處設置為1-->
    <bufferSize value="1" />
    <param name="ConnectionType"  value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
    <param name="ConnectionString"  value="server=localhost;user id=root;password=root;database=current;port=3306;CharSet=utf8;" />
    <commandText value="insert into ErrorLog(dtDate,sThread,sLevel,sLogger,sMessage,sException) 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="100" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%t" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="200" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%p" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="500" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="3000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@exception" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
  </appender>
</log4net>

附上建表sql

CREATE TABLE `errorlog` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dtDate` datetime DEFAULT NULL,
  `sThread` varchar(100) DEFAULT NULL,
  `sLevel` varchar(200) DEFAULT NULL,
  `sLogger` varchar(500) DEFAULT NULL,
  `sMessage` varchar(3000) DEFAULT NULL,
  `sException` varchar(4000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='錯誤日志表'

OK, 接下來可以直接看結果了:

還是蠻好用的, 配置起來也很簡單. 使用起來更簡單.

 

參考:

  log4net使用手冊

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved