log4j将所有日志输出定向到stdout,即使它不应该

时间:2009-08-07 10:59:25

标签: java log4j

在我的log4j.properties中,我有:

log4j.rootLogger=DEBUG,stdout

log4j.logger.notRootLogger=DEBUG,somewhereelse

appenders stdout和somewhereelse都配置正确,stdout写入控制台,somewhereelse写入文件。

在每个班级的代码中,我都设置了:

static Logger log =  Logger.getLogger("notRootLogger);

^当我不想要东西进入控制台时。

-OR -

static Logger log = Logger.getRootLogger();

^当我这样做。

我需要在log4.properties中做些什么来停止写入notRootLogger以stdout结尾的内容?根记录器写入的地方是否有某种继承需要以某种方式关闭?

我不想单独为每个单独的类配置一个记录器,我只想记录到控制台。

3 个答案:

答案 0 :(得分:23)

您需要设置additivity = false,IIRC。来自log4j manual

  

每个启用的日志记录请求   给定的记录器将转发给所有人   该记录器中的追加器也是如此   作为更高的appenders   层次结构。换句话说,appenders   从...中继承而来   记录器层次结构。例如,如果是   console appender被添加到根目录   记录器,然后所有启用的记录   请求至少会打印出来   安慰。如果另外一个文件   appender被添加到记录器,比如C,   然后启用C的日志记录请求   和C的孩子将打印在一个文件上   并在控制台上。有可能   覆盖此默认行为,以便   appender积累不再   添加剂通过设定添加剂   标志为假。

试试这个:

log4j.rootLogger=DEBUG,stdout
log4j.logger.notRootLogger=DEBUG,somewhereelse
log4j.additivity.notRootLogger=false

答案 1 :(得分:0)

嗯,应该仔细阅读log4j的简短介绍

log4j.additivity.notRootLogger=false

修复它,因为它从层次结构中它上面的记录器继承了appender,而root记录器显然位于层次结构的顶层。

答案 2 :(得分:0)

如果在java类中定义了logger的属性,最后可以调用logger.shutdown()方法,最好在finally块中禁止logger的附加性。