2011-03-23 126 views
2

我覺得這應該是可能的,但是我一次只能讓log4net去一個appender。寫入兩個不工作的位置

<?xml version="1.0" encoding="utf-8" ?> 
<log4net debug="false"> 
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\Logs\webclient\Admin.Web\logs\admin.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <datePattern value="yyyyMMdd" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 
    <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 

    <!--Database appender--> 
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
    <bufferSize value="10" /> 
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
    <connectionString value="Data Source=(localhost); Database=Error_Logs; Persist Security Info=True;User ID=;Password=" /> 
    <commandText value="INSERT INTO [GeneralServiceLog] ([dtLog],[vchLevel],[vchLogger],[vchMessage],[vchException]) 
    VALUES(@log_date, @log_level, @logger, @message, @ex)" /> 
    <parameter> 
     <parameterName value="@log_date" /> 
     <dbType value="DateTime" /> 
     <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" /> 
    </parameter> 
    <parameter> 
     <parameterName value="@log_level" /> 
     <dbType value="String" /> 
     <size value="50" /> 
     <layout type="log4net.Layout.PatternLayout" value="%level" /> 
    </parameter> 
    <parameter> 
     <parameterName value="@logger" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout" value="%logger" /> 
    </parameter> 
    <parameter> 
     <parameterName value="@message" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.PatternLayout" value="%message" /> 
    </parameter> 
    <parameter> 
     <parameterName value="@ex" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.ExceptionLayout" /> 
    </parameter> 
    </appender> 
    <root> 
    <level value="ERROR" /> 
    <appender-ref ref="AdoNetAppender" /> 
    </root> 
    <Logger> 
     <level value="DEBUG" /> 
     <appender-ref ref="RollingLogFileAppender" /> 
    </Logger>  
</log4net> 

我想ERROR級別的消息去數據庫和DEBUG級別的消息要到文本文件,但所有的消息都只是去文件。

我錯過了什麼?

謝謝!

回答

4

您需要配置根記錄如下:

<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="AdoNetAppender" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
</root> 

,那麼你的過濾器添加到數據庫的appender:

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

更新: 您的配置的問題是,你將db appender分配給一個未命名的記錄器,因此你的appender很可能永遠不會被調用。在log4net中,您可以將appender分配到loggers,但不能分配到級別。

+0

你是正確的,它從來沒有被召喚;然而,你的解決方案就像一個魅力。另外,感謝您的鏈接!我試着在那裏找到答案,然後我漫步在這裏問,那個頁面和整個系列的教程正是我所需要的(4mos * g *) – 2011-03-25 13:17:38