消除log4net中的重复日志logging

我有一个程序,使“myprogram”logging器的许多log4net调用。 它还调用其他代码,使log4net调用其他logging器。 我想为“myprogram”捕获所有高于INFO的日志,并且所有其他日志的日志高于WARN。 这样,我得到了正在处理的任务的特定于工作进程的消息,但是仍然会收到有关支持代码中可能发生的不良事件的通知。 我想这发送到控制台和日志文件。

我有以下的log4netconfiguration:

<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> 

这对我来说是完全有意义的:log> WARN for everything和> INFO for the特定的“myprogram”logging器。

问题是我得到两个控制台和LogFilelogging两次 INFO消息。 这只会发生,如果我同时填充<root><logger>元素; 如果我删除了其中一个,那么剩下的一个就像我期望的那样工作。

我可以理解,如果我得到WARN条目的双重logging(因为myprogram匹配“root”和“myprogram”),但它发生在INFO,即使ROOT(大概)设置为WARN。

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

你得到了重复,因为你告诉它logging消息两次。 我不build议在这里使用additivity,因为你可能会遇到一些副作用,只是删除不必要的configuration:

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

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

尝试这个改变,设置加法为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>