log4j不记录来自main以外的类的消息

时间:2011-07-17 08:31:51

标签: java log4j

我正在试图弄清楚如何让log4j在我的项目中运行。我有2个类,一个名为testWithMain.TestSectionSplit,另一个名为search.SectionScanner。在TestSectionSplit中,我调用

Logger log = Logger.getLogger(TestSectionSplit.class);
PropertyConfigurator.configure(FilePaths.LOGGER_CONFIG);

其中FilePaths.LOGGER_CONFIG指向配置文件。 在SectionScanner类中,我只需创建一个静态字段

private Logger logger = Logger.getLogger(SectionScanner.class);

配置文件看起来像

# =========================
# appenders configuration
# =========================

# console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.threshold=ALL
log4j.appender.console.layout=org.apache.log4j.PatternLayout


# =========================
# loggers configuration
# =========================

log4j.rootLogger=ALL, console

log4j.logger.search.SectionScanner=ALL, console

问题是,虽然TestSectionSplit中的日志记录信息已在控制台上正确记录,但是不会打印来自SectionScanner的消息,从而给出了此错误消息

log4j:ERROR Attempted to append to closed appender named [console].

如果我注释掉该行

log4j.logger.search.SectionScanner=ALL, console

在配置文件中,不会打印日志消息或错误。 我无法理解我做错了什么。

2 个答案:

答案 0 :(得分:2)

通过在代码中调用PropertyConfigurator.configure(),您可以在初始化后重新配置log4j。无论它首先被初始化的配置如何,它还有一个名为“console”的追加器。重新初始化log4j时,该appender会被关闭,但是其他一些线程正试图写入它:因此错误。如果这是您要使用的配置,configure your app从一开始就使用它,而不是在应用运行时重新初始化日志记录。

答案 1 :(得分:1)

您的类路径中似乎也有默认的log4j.properties或log4j.xml文件,或者您正在加载不同的属性文件,并且默认文件也定义了log4j.logger.search.SectionScanner appender。尝试注释掉该行,看看它是否仍然有效,或者确保您的类路径中没有默认文件,或者在两个不同的属性文件中定义了两次相同的appender。