configurationlog4net根据级别向不同的appender发送错误
我想发送信息级别及以上的XML appender和错误/致命的级别EventLog appender。
我收集到,我需要修改configuration的根元素,但我正在努力的语法。 在指定的级别或级别范围内,将日志定向到正确的appender的configuration语法是什么?
这是迄今为止的configuration:
<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。 现在的工作解决scheme如下所示:
<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>
这可以使用appender中的threshold
或filter
元素来完成。
请注意,阈值可以直接在appender之下,作为包容性filter,或者在evaluator
之下
<evaluator type="log4net.Core.LevelEvaluator"> <threshold value="ERROR"/> </evaluator>
在适用的情况下,它作为跳过缓冲(即时输出)的包容性filter。
完整解释( 来源 ):
<threshold value="ERROR" />
阈值是在
AppenderSkeleton
实现的,因此几乎所有的appender都支持。 这只是一个简单的testing,用于忽略低于阈值的logging事件。 门槛检查提前,作为一个简单的testing是非常高效的。还有另一种方法可以使用filter指定与阈值相同的行为。 filter是非常灵活的,因为它们是可插入的,你也可以开发自己的定制逻辑,并将其插入到filter链中。
<filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="ERROR" /> <levelMax value="OFF" /> </filter>
像阈值检查filter在AppenderSkelton基类中实现,几乎所有appender都支持。 以上filter的效果与<threshold value="ERROR" />
效果相同。 它是一个LevelRangeFilter,它将允许通过ERROR
范围内的级别OFF
(包含)的任何事件。 请注意, OFF
是最高级别的名称,相反, ALL
是最低级别的名称。
filter具有很大的灵活性,因为多个filter可以链接在一起,以提供对输出事件的细粒度控制。 正因为如此,它们在性能方面也有较高的成本,链条中的每个filter都是一个对象,并被要求决定正确的行动方向。 在阈值过滤的简单情况下,阈值属性应优先于filter使用。
Evaluator
是由BufferingAppenderSkeleton
实现的,因此只能由扩展这个基类并为缓冲提供支持的appender支持。 SmtpAppender就是这样一个appender。
Evaluator
是一个可插入的对象,BufferingAppenderSkeleton使用该对象来确定是否不应caching日志事件,而是立即写入/发送。 如果评估者决定事件是重要的,那么当前缓冲区的全部内容将与事件一起发送。 评估者不会像阈值或filter那样工作,因为它不会丢弃事件。
您可以为每个appender设置不同的阈值属性。 所有低于阈值级别的日志事件都被appender忽略。 我粘贴在两个appender之下,一个用于文件,另一个用于数据库(应该设置连接string)。 数据库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>
我有同样的问题。 看来,假设我正在理解原来的问题,阈值将不起作用,因为它会将某些输出发送给一个appender,并将其余的输出给另一个appender。 按照上面的build议,我可以使用LevelRangeFilter工作。 我想要错误,信息和警告去一个appender和所有其他appender,但不是错误,信息和警告。
这是为我工作的configuration:
<?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>
谢谢,尼克