当前位置: 首页 > 知识库问答 >
问题:

Log4j公共记录桥被忽略

李嘉胜
2023-03-14

我们的web应用程序在tomcat 9容器中运行,并使用Log4j 2.13。3作为测井系统

web应用程序包括org.apache.xmlgraphics:fop 2.3,它使用apache共享日志记录(我们设置中的版本为1.2,而不是fop中最初使用的1.0.4)。

这个组合已经使用log4-jcl、共享日志记录桥运行了多年,所有共享日志记录输出都正确地进入了log4j配置的文件。配置相当简单,如这个SO答案所述

然而,没有明显的原因,fop最近开始将其所有(相当冗长的)日志写入stderr(即直接写入catalina.out),而不是配置的日志文件,但仅在我们的一些系统上。我们有大约50个tomcat实例运行基本相同的软件和相同的系统配置;其中三分之一仍然正确记录。

我假设commons日志记录没有找到log4jcl的org实现。阿帕奇。平民登录中。伐木厂。

使用Configuration status=“trace”调试log4j不会在log4jcl或其他地方提供任何故障提示。

我已经失去理智了。有什么建议吗?

共有2个答案

景阳曜
2023-03-14

而你的答案解释了为什么log4j2。没有选择x作为JCL的后端,一些细节没有加起来:原始的commons日志记录从不选择SLF4j作为后端(参见源代码)。因此,情况必须更加复杂:

  • 原始的commons日志记录通过ServiceLoader实用程序发现替代的LogFactory实现

因为类加载器随机加载org。阿帕奇。平民登录中。日志工厂commons日志记录spring-jcl中创建的类您可能会遇到两种问题:

  1. 如果选择了共享日志版本,则ServiceLoader将随机加载log4j-jcl的实现或sping-jcl的实现。你在回答中已经解决了这个案子。
  2. 如果选择了sping-jcl的版本,将使用SLF4J后端。

为了解决所有这些潜在的问题,我会:

  1. 删除原始的共享日志记录并保留克隆的sping-jcl。更好的是,我将两者都排除,并使用确定性的jcl-over-slf4j(始终使用SLF4J的完整JCL替换)
  2. 删除log4j-jcl,因为它不再需要(它只是由原来的共享日志需要),
  3. 添加log4j-slf4j-implSLF4J绑定。

此解决方案为日志配置添加了额外的API(JCL-

子车鸿才
2023-03-14

回答我自己的问题以防对别人有帮助。

我需要添加一个名为commons logging的文件。类路径中的属性,包含一行:

org.apache.commons.logging.LogFactory=org.apache.logging.log4j.jcl.LogFactoryImpl

皮奥特关于设置org.apache.commons.logging.diagnostics.dest.的评论值得称赞

显然,如果没有显式指定类,则实际使用的LogFactory的实现取决于类加载器加载潜在候选的顺序(有些随机)。

我在我的webapp中看到一个maven依赖项将sl4f作为一个可传递依赖项带来,因此在一些系统上选择了slf4j而不是log4j,但slf4没有有效的配置,默认为STDERR。

 类似资料:
  • 问题内容: 以下代码是从文档中复制的。我应该能够查看所有信息日志。但是我没有。即使将setLevel设置为INFO,我也只能看到警告和以上内容。 为什么会这样呢?: 输出: 信息和调试消息到哪里去了? 问题答案: 更换线 与 它应该可以按预期工作。如果您不使用任何处理程序来配置日志记录(如您的帖子中所示,您只为记录器配置一个级别,但在任何地方都没有处理程序),则将获得一个“不得已使用”的内部处理程

  • 问题内容: 有没有一种方法可以将log4j日志事件写入到也由其他应用程序写入的日志文件中。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化? 问题答案: Log4j有一个SocketAppender,它将事件发送到服务,您可以自己实现或使用与Log4j捆绑在一起的简单实现。 它还支持syslogd和Windows事件日志,这对于尝试将日志输出与非Java应用程序中的事件统一起来可

  • 我目前有log4j配置了一个XML配置文件,它有两个附录,“文件”和“电子邮件”。这两个都正常工作,但是我不想发送电子邮件给ESAPI内部产生的错误,所以我在XML文件中放入了一个新的记录器。记录器的完整列表是: 然而,这不起作用。我仍然会收到ESAPI中生成的错误的电子邮件(特别是org.owasp.esapi.reference.Log4JLogger类)。 我还尝试过使用“org.owasp

  • 我有一个log4j配置文件,其中有两个记录器和两个特殊的附加器。该文件的外观如下所示: 这个班看起来是这样的 这样做的结果是: main_logger.log [忽略log4j模式布局]您好 [忽略log4j模式布局]世界! log_error.log “忽略log4j模式布局”世界! 我的想法只是将我想要的事件记录在分开的文件中,但是当我调用记录器时,输出在这两个文件中,我的意思是在为appen

  • 我的应用程序使用log4j,但OkHttpClient使用java util日志记录。因此,除了log4j.properties之外,我创建了一个包含以下内容的logging.properties文件: 然后,我将此添加到用于启动应用程序的jvm参数中 但我没有看到任何新的文件夹被创建,如FileHandler所指示的。有人知道为什么吗?

  • 我计划用log4j one替换旧的记录器。我需要创建继承Logger的新类LocalLogger,而不是直接使用Logger。这样做的原因-我需要旧记录器中可用的新日志方法名称。 我有log4j记录器: 如何以与Logger相同的方式实现LocalLogger的功能? 如何将c类传递给超级本地记录器? LocalLogger的草稿: