如何防止log4j日志被重定向到根记录器

3
我只定义了两个记录器:一个是根记录器,另一个是通用记录器。我认为通用记录器成为了根记录器的直接子记录器,对吗?如果是的话,如何防止由通用记录器的appender打印的日志上浮到根记录器的appender中?
根据文档:
“然而,如果logger C的祖先(比如说P)的additivity标志被设置为false,那么C的输出将会被定向到C和它的祖先(包括P)中的所有appenders,但不包括P的任何祖先的appender。”
这意味着,其additivity被设置为false的记录器将使其所有日志上浮到其父记录器,但不会超出该范围。我的理解正确吗?
如果是的话,那么设置通用记录器的additivity标志是无效的(实际上并没有起作用),日志仍然被同时打印到通用和根记录器。如何防止这种情况发生?

你使用的是什么服务器? - ZaoTaoBao
我正在使用Tomcat,具体地说是Tomcat 7。 - Shailesh Vaishampayan
我无法帮助你……但也许你可以在ServerFault上询问。抱歉。 - ZaoTaoBao
2个回答

4
#root logger config starts
log4j.rootLogger=INFO, RA
log4j.appender.RA=org.apache.log4j.RollingFileAppender
log4j.appender.RA.File=/Data/var/logs/root.log
log4j.appender.RA.MaxFileSize=100KB
# Keep one backup file
log4j.appender.RA.MaxBackupIndex=1
log4j.appender.RA.layout=org.apache.log4j.PatternLayout
log4j.appender.RA.layout.ConversionPattern=%p %d - %m%n
# root config logger ends

#ico common logger config starts
log4j.logger.com=INFO, COMMONA
log4j.appender.COMMONA=org.apache.log4j.RollingFileAppender
log4j.additivity.com=false
log4j.appender.COMMONA.File=/Data/var/logs/common_ico.log
log4j.appender.COMMONA.MaxFileSize=100KB
# Keep one backup file
log4j.appender.COMMONA.MaxBackupIndex=1
log4j.appender.COMMONA.layout=org.apache.log4j.PatternLayout
log4j.appender.COMMONA.layout.ConversionPattern=[%x]%p %d - %m%n
#ico common logger config ends

上面的配置是可行的。我之前使用了log4j.additivity.COMMONA=false而不是log4j.additivity.com=false

2
通过此配置
<appender name="a2" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="common %m%n" />
    </layout>
</appender>
<appender name="a1" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="root %m%n" />
    </layout>
</appender>
<logger name="common" additivity="false">
    <appender-ref ref="a2" />
</logger>
<root>
    <priority value="debug" />
    <appender-ref ref="a1" />
</root>

这个

Logger.getLogger("common").debug("1111");

打印

common 1111

我猜你的配置转换为以下.property配置:#根记录器配置开始 log4j.rootLogger=DEBUG, a1 log4j.appender.a1=org.apache.log4j.ConsoleAppender log4j.appender.a1.layout=org.apache.log4j.PatternLayout log4j.appender.a1.layout.ConversionPattern=%p %t %c - %m%n #根配置记录器结束#常规记录器配置开始 log4j.logger.common= a2 log4j.appender.a2=org.apache.log4j.ConsoleAppender log4j.additivity.a2=false log4j.appender.a2.layout=org.apache.log4j.PatternLayout log4j.appender.a2.layout.ConversionPattern=[%x]%p %t %c - %m%n - Shailesh Vaishampayan
我有类似的配置,除了我使用了文件附加器,并在两个记录器上设置了日志级别(优先级)为INFO。然而,它不起作用。它会将内容打印到两个文件中。 - Shailesh Vaishampayan
抱歉 @Evgeniy Dorofeev,它已经可以工作了。我的配置中有一个小错误。我在 additivity 标志后使用了 appender 名称,而不是使用 logger 的名称。 - Shailesh Vaishampayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接