我们的 Web 应用程序在 tomcat 9 容器中运行,并使用 Log4j 2.13.3 作为日志记录系统。
Web 应用程序包含 org.apache.xmlgraphics:fop 2.3,它使用 apache commons-logging(我们设置中的版本 1.2,而不是 fop 中最初使用的 1.0.4)。
这个组合已经使用 log4-jcl、Commons Logging Bridge 运行了多年,并且所有 commons-logging 输出都正确地进入了 log4j 配置的文件中。配置相当简单,如in this SO answer所述。
但是,没有明显的原因,fop 最近开始将其所有(相当详细)日志写入 stderr(即直接写入 catalina.out),而不是配置的日志文件,但仅限于某些我们的系统。我们有大约 50 个 tomcat 实例,运行基本相同的软件和相同的系统配置;其中三分之一仍然正确记录。
我假设 commons-logging 找不到 log4j-jcl 的 org.apache.commons.logging.LogFactory 实现。
使用 Configuration status="trace"调试 log4j 不会提供 log4j-jcl 或其他地方出现故障的任何提示。
我已经失去理智了。有什么建议吗?
最佳答案
回答我自己的问题,以防对其他人有帮助。
我需要在类路径中添加一个名为 commons-logging.properties 的文件,其中包含一行:
org.apache.commons.logging.LogFactory=org.apache.logging.log4j.jcl.LogFactoryImpl
感谢 Piotr 关于设置 org.apache.commons.logging.diagnostics.dest 的评论。
显然,如果没有明确指定类,则实际使用的 LogFactory 的实现取决于类加载器加载潜在候选者的(有点随机)顺序。
我的 web 应用程序的 Maven 依赖项将 sl4f 作为传递依赖项带来,因此在某些系统上选择 slf4j 而不是 log4j,但 slf4 没有有效的配置,并且默认为 STDERR。
关于java - Log4j Commons Logging Bridge 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69945175/