2011-03-23 122 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