我觉得这应该是可能的,但我只能让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级别消息转到文本文件,但所有消息都将转到文件。
我错过了什么?
谢谢!
答案 0 :(得分: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,但不能分配给级别。