2009-09-07 113 views
41

將錯誤發送給不同的appender我想將上面的信息級別&發送到XML Appender和EventLog appender的錯誤/致命級別。配置log4net根據級別

我收集到,我需要修改配置的根元素,但我努力與語法。什麼是將日誌定向到給定級別或範圍的正確appender的配置語法?

這是迄今爲止配置:

<log4net> 
    <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    </appender> 
    <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="SomeXmlAppender" /> 
    <appender-ref ref="SomeEventLogAppender" /> 
    </root> 
</log4net> 

編輯:感謝@agileguy。那篇文章確實包含了我需要的syntaxt。現在的工作解決方案如下所示:

<log4net> 
    <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="INFO"/> 
    </evaluator> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="INFO" /> 
     <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    </appender> 
    <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="ERROR"/> 
    </evaluator> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="ERROR" /> 
     <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="SomeXmlAppender" /> 
    <appender-ref ref="SomeEventLogAppender" /> 
    </root> 
</log4net> 
+5

注意的評估僅用於支持緩衝追加程序。如果你想爲每個appender指定一個特定的級別,你只需要使用元素 - 它不需要被包裝在評估器中。 – Brian 2011-01-24 20:23:51

+0

元素只應用於實現BufferingAppenderSkeleton(即不是RollingFileAppender)的appender。 – dave 2014-07-27 19:41:38

+0

我認爲格雷厄姆先生的文章[這裏](http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx)會幫助你。 – 2009-09-07 10:20:29

回答

6

您可以爲每個appender設置不同的閾值屬性。所有等級低於閾值級別的日誌事件都會被appender忽略。我正在粘貼兩個appender,一個用於文件,另一個用於數據庫(您應該設置連接字符串)。數據庫appender具有閾值屬性,指示只有錯誤將被保存在數據庫中。

<configuration> 
    <log4net> 
    <!--Database appender--> 
    <appender name="DbAppender" type="log4net.Appender.ADONetAppender"> 
     <bufferSize value="0" /> 
     <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <connectionString value="Data Source=AEG-PC\SQLEXPRESS;Initial Catalog=JCZ6;Uid=sa;Pwd=qwerty;" /> 
     <commandText value="INSERT INTO Log4Net ([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="%t" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@log_level" /> 
     <dbType value="String" /> 
     <size value="10" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%p" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@logger" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%c" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@message" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <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> 
     <threshold value="Error" /> <!--THIS IS THE IMPORTANT LINE--> 
    </appender> 
    <!--File appender--> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="log-file.txt" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="FileAppender" /> 
     <appender-ref ref="DbAppender" /> 
    </root> 
    </log4net> 
</configuration> 
13

這可以通過使用附加器內的thresholdfilter元件來完成。

請注意,閾值可以直接在appender下面,它可以作爲包容性過濾器,也可以在例如evaluator

<evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="ERROR"/> 
</evaluator> 

它在那裏用作跳過緩衝(即時輸出)的包容式過濾器,如果適用的話。



充分說明(source):

<threshold value="ERROR" /> 

的閾值在AppenderSkeleton實現,因此 支持幾乎所有追加程序。這只是一個簡單的測試,用於忽略低於閾值的日誌記錄事件,即 。 提前檢查閾值,因爲簡單測試的性能非常高。

還有一種方法可以使用過濾器指定與閾值 相同的行爲。過濾器非常靈活,因爲它們是可插入的,您還可以開發自己的定製邏輯並將其插入過濾器鏈中。

<filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="ERROR" /> 
    <levelMax value="OFF" /> 
</filter> 

像閾值檢查過濾器在AppenderSkelton基類中實現和幾乎所有的appender都支持。以上過濾器的效果與<threshold value="ERROR" />相同。它是一個LevelRangeFilter,允許通過範圍在ERROROFF(含)之間的任何事件。請注意,OFF是最高級別的名稱,相反ALL是最低級別的名稱。

過濾器具有很強的伸縮性很大,因爲多個過濾器可以 鏈接在一起,以提供對那些輸出的事件 細粒度控制。正因爲如此,它們在性能方面也有較高的成本,鏈條中的每個過濾器都是一個對象,並被要求決定正確的行動方向。在 閾值過濾的簡單情況下,閾值屬性應該在 優先級中用於過濾器。

EvaluatorBufferingAppenderSkeleton和 實現因此僅由延伸此基類 並提供緩衝支撐追加程序的支持。 SmtpAppender就是這樣一個appender。

Evaluator是用於由 BufferingAppenderSkeleton,以確定是否一個記錄事件不應 被緩衝的可插對象,而是寫入/立即發送。如果評估者 確定該事件很重要,則當前緩衝區的全部內容將與該事件一起發送。評估者 不起作用,像閾值或過濾器,因爲它不會丟棄事件 。

1

我有同樣的問題。看起來,假設我理解了原始問題,閾值將不起作用,因爲它會將某些輸出發送給一個appender,並將其餘的信息發送給另一個appender。按照上面的建議,我可以使用LevelRangeFilter工作。我想要ERROR,INFO和WARN去一個appender,所有其他的去另一個appender,但不是ERROR,INFO和WARN。

下面是這爲我工作的配置:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
     <appender name="LoggingAppender" type="log4net.Appender.FileAppender" > 
      <file value="logs.txt" /> 
      <filter type="log4net.Filter.LevelRangeFilter"> 
       <levelMin value="INFO"/> 
       <levelMax value="OFF"/> 
      </filter> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> 
      </layout> 
     </appender> 
     <appender name="TracingAppender" type="log4net.Appender.FileAppender" > 
      <file value="traces.txt" /> 
      <filter type="log4net.Filter.LevelRangeFilter"> 
       <levelMin value="ALL"/> 
       <levelMax value="DEBUG"/> 
      </filter> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> 
      </layout> 
     </appender> 
     <root> 
      <appender-ref ref="LoggingAppender"/> 
      <appender-ref ref="TracingAppender"/> 
     </root> 
    </log4net> 
</configuration> 

感謝, 尼克