我们为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);
为什么没有为未定义的类选择此配置中的根记录器的任何想法?
答案 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
在类路径中!