在我的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结尾的内容?根记录器写入的地方是否有某种继承需要以某种方式关闭?
我不想单独为每个单独的类配置一个记录器,我只想记录到控制台。
答案 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的附加性。