Tomcat Log4J问题 - 找不到appender

时间:2011-09-05 20:56:24

标签: java log4j

我们为tomcat设置了一个非常简单的log4j。我们只有一个log4j.properties文件,并在启动时添加了调试标志,以验证是否正在使用正确的log4j.properties文件。

以下是我们的配置:

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %.20t:%c{1}:%L - %m%n
log4j.appender.stdout2=org.apache.log4j.ConsoleAppender
log4j.appender.stdout2.Target=System.out
log4j.appender.stdout2.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout2.layout.ConversionPattern=%d{ABSOLUTE} %5p %.20t:%c{1}:%L - %m%n

log4j.rootLogger=INFO, stdout
log4j.logger.com.rei.framework.model.Table=INFO, stdout2
log4j.logger.com.rei.framework.view.SqlGridDisplayGroup=WARN, stdout2

我们遇到的问题是除非我专门为每个类列出一个记录器,否则我会收到此错误:

log4j:WARN No appenders could be found for logger (com.rei.util.DatabaseConnection).
log4j:WARN Please initialize the log4j system properly.

根据文档,ROOT记录器应该是没有特定配置行的任何类的默认记录器,但如果我没有枚举配置中的每个类,我会收到许多“未找到appender”警告。在我们的项目中有数百个类,这是不可维护的。

我们在每个类中以这种方式实例化记录器:

static Logger logger = org.apache.log4j.Logger.getLogger(Myclass.class);

为什么没有为未定义的类选择此配置中的根记录器的任何想法?

2 个答案:

答案 0 :(得分:4)

你是对的,log4j.rootLogger应该是默认配置。当你没有行

时,你会发生这种行为
log4j.rootLogger=INFO, stdout

在你的档案中。我用上面的文件测试过,这对我有用。因此,在您实际使用的文件中,您没有该行,或者您正在使用不同版本的log4j(我尝试过使用1.2.9到1.2.16)。

在命令行中指定-Dlog4j.debug时,应该得到如下输出:

log4j: Using URL [file:/C:/developpement/mjf-workspace/Stackoverflow/lib/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/C:/developpement/mjf-workspace/Stackoverflow/lib/log4j.properties
log4j: Could not find root logger information. Is this OK?
log4j: Parsing for [com.rei.framework.model.Table] with value=[INFO, stdout2].
log4j: Level token is [INFO].
log4j: Category com.rei.framework.model.Table set to INFO

你能得到这条线:

log4j: Could not find root logger information. Is this OK?

如果你得到了,那么你的log4j.properties文件有问题。这是我用来测试的java类:

package uk.co.farwell.stackoverflow;

import org.apache.log4j.*;

public class Log4jTest {
    static Logger logger = Logger.getLogger(Log4jTest.class);

    public static void main(String args[]) {
        logger.debug("hello Log4jTest");
    }
}

编辑:事实证明,您导入到类中并因此使用的Logger类是Apache commons日志记录,而不是log4j。 Apache commons日志记录使用rootCategory,而不是rootLogger(参见Configuring Log4J

log4j.rootCategory=INFO, stdout

这就是它没有拿起默认记录器的原因。尝试将此行添加到log4j.properties。

混合您的日志框架不是一个好主意,所以选择一个并坚持下去。如果公共日志记录适合您,请使用它。但是不要在代码中混合搭配。这是一个坏主意,并导致很多混乱。

就个人而言,我总是使用 slf4j 。 slf4j允许您为多个框架配置一个配置,因此我默认使用它。 slf4j通常是强制性的,因为第三方库使用公共日志记录甚至是java日志记录,你无法改变它。 slf4j使用一个桥梁,所以一切都在同一个地方出现,也可以工作。

它还有许多优点,例如parameterized logging

建议:使用slf4j。

答案 1 :(得分:1)

确保您的log4j.properties在类路径中!