63

我有一个程序可以对“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>

这对我来说非常有意义:为所有内容记录>WARN,为特定的“myprogram”记录器记录>INFO。

问题是我在控制台和日志文件上都记录了两次INFO 消息。仅当我同时填充了<root>和元素时,才会发生这种情况;<logger>如果我删除任何一个,那么剩下的一个会按我的预期工作。

我可以理解我是否获得了 WARN 条目的双重记录(因为 myprogram 同时匹配“root”和“myprogram”),但是即使 ROOT(可能)设置为 WARN,它也会发生在 INFO。

我在这里做错了什么,或者这是一个 log4net 错误/歧义?

4

2 回答 2

80

你被重复了,因为你告诉它记录两次消息。我不建议在这里使用可加性,因为您可能会遇到一些副作用,只需删除不必要的配置:

<root>
    <level value="WARN" />
    <appender-ref ref="Console" />
    <appender-ref ref="LogFile" />
</root>
<logger name="myprogram">
    <level value="INFO" />
</logger>

您不需要在记录器 myprogram 中指明 appender-ref,因为它将从根记录器继承它们;如果您再次指定它们,它将记录两次。

于 2009-03-19T11:47:05.817 回答
71

尝试进行此更改,将可加性设置为 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>
于 2009-03-16T17:08:43.827 回答