[英]Why are some logs not caught by log4j?
我已经将log4j配置为在容器中记录后端,但是显然不是所有日志都通过log4j进行了过滤。
来自应用程序的日志将按预期写入到我的控制台/日志文件。
例如,我使用的是openwebbeans,即使该库内部在使用log4j,该库中的日志仍采用默认格式并写入系统。
为什么我的log4j配置没有将那些日志语句定向到我的控制台/日志文件? 我希望它们至少会被写入根记录器,但是它们不会通过根记录器写入的附加程序。
log4j.appender.Stdout=org.apache.log4j.ConsoleAppender
log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Stdout.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss}|%-5p|%c|%m%n
log4j.rootLogger=DEBUG,Stdout
log4j.logger.org.apache.wicket=INFO
log4j.logger.org.apache.webbeans=WARN
...
感谢上面Mark的评论,我设法通过配置java.util.logging重定向到slf4j来解决我的问题。 这不是一个优雅的解决方案,但出于我需要的目的,它已足够:
private static void configureJavaUtilLogging() {
final java.util.logging.Logger rootLogger = java.util.logging.Logger.getLogger("");
for (final java.util.logging.Handler handler : rootLogger.getHandlers()) {
handler.setLevel(Level.OFF);
}
rootLogger.setLevel(Level.INFO);
rootLogger.addHandler(new java.util.logging.Handler() {
@Override
public void publish(final LogRecord record) {
final Logger log = LoggerFactory.getLogger(record.getSourceClassName());
if (record.getLevel() == Level.SEVERE) {
if (record.getThrown() == null) {
log.error(record.getMessage());
} else {
log.error(record.getMessage(), record.getThrown());
}
} else if (record.getLevel() == Level.WARNING) {
log.warn(record.getMessage());
} else if (record.getLevel() == Level.INFO) {
log.info(record.getMessage());
} else {
log.debug(record.getMessage());
}
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
}
});
}
这样,我可以在一个配置中为每个人配置日志输出。 基本上,上面的代码将覆盖存储在jdk或jre中某个位置的java.util.logging的默认配置。
我不确定该使用flush
和close
方法。 在生产环境中使用此类东西之前,需要先进行检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.