【问题标题】:Why are some logs not caught by log4j?为什么有些日志没有被 log4j 捕获?
【发布时间】:2023-03-25 15:47:01
【问题描述】:

我已将 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
...

【问题讨论】:

标签: java logging log4j


【解决方案1】:

感谢上面 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 的默认配置。

我不确定如何处理 flushclose 方法。在生产环境中使用这种东西之前,需要检查这些东西。

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2021-10-21
    • 2010-11-16
    • 2010-12-25
    相关资源
    最近更新 更多