java - Log4j Commons Logging Bridge 被忽略

标签 java tomcat log4j apache-commons-logging

我们的 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/

相关文章:

java - 如何将 jar 导入我的 java 程序?

spring - 在 Camel REST dsl 中访问 Tomcat 上下文参数

java - 可以对不同的方法使用不同的 log4j 附加程序吗?

android - Android 中的 log4j 支持

java - jOOQ 使用一个数据库生成代码,使用另一个数据库执行代码

java - Java应用服务器利用304 HTTP响应将数据缓存到JavaScript中是否正常

java - 防止广告在后台展示 (Android Studio)

jsp - 生/tomcat : set session variable after j_security_check

tomcat - Jetty-Runner 只使用一个 CPU?

java - 如何设置每个实例和每个包层次结构的日志级别