我有一个程序可以对“myprogram”记录器进行许多log4net调用。它还调用其他代码,使log4net调用其他记录器。我想为“myprogram”捕获高于INFO的所有日志,并为所有其他内容捕获高于WARN的所有日志。这样,我就可以获得特定于我正在处理的任务的正在进行的工作消息,但仍然会通知支持代码中发生的潜在不良事件。我希望将其发送到控制台和日志文件。
我有以下log4net配置:
<log4net>
<root>
<level value="WARN" />
<appender-ref ref="Console" />
<appender-ref ref="LogFile" />
</root>
<logger name="myprogram">
<level value="INFO" />
<appender-ref ref="Console" />
<appender-ref ref="LogFile" />
</logger>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
<threshold value="INFO" />
</appender>
<appender name="LogFile" type="log4net.Appender.RollingFileAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="- %utcdate %level %logger %ndc %thread %message%newline" />
</layout>
<appendToFile value="false" />
<staticLogFileName value="true" />
<rollingStyle value="Once" />
<file value="mylogfile" />
<immediateFlush value="true" />
<threshold value="INFO" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
</appender>
</log4net>
这对我来说非常有意义:记录&gt;所有内容的WARN和特定“myprogram”记录器的&gt; INFO。
问题是我在控制台和LogFile上都记录了两次的INFO消息。只有当我同时填充了<root>
和<logger>
元素时才会发生这种情况;如果我删除任何一个,那么剩下的一个按预期工作。
我能理解我是否正在获取WARN条目的双重记录(因为myprogram匹配“root”和“myprogram”),但它发生在INFO,即使ROOT(大概)设置为WARN。
我在这里做错了什么,或者这是一个log4net错误/歧义?
答案 0 :(得分:77)
您正在复制,因为您告诉它两次记录消息。我不建议在这里使用可加性,因为您可能会遇到一些副作用,只需删除不必要的配置:
<root>
<level value="WARN" />
<appender-ref ref="Console" />
<appender-ref ref="LogFile" />
</root>
<logger name="myprogram">
<level value="INFO" />
</logger>
您不需要在logger myprogram中指明appender-ref,因为它将从根记录器继承它们;如果再次指定它们,它将记录两次。
答案 1 :(得分:68)
尝试使用此更改,将可加性设置为false。
<root>
<level value="WARN" />
<appender-ref ref="Console" />
<appender-ref ref="LogFile" />
</root>
<logger name="myprogram" additivity="false">
<level value="INFO" />
<appender-ref ref="Console" />
<appender-ref ref="LogFile" />
</logger>