【问题标题】:Find source/origin of log4j logging statements?查找 log4j 日志记录语句的来源/来源?
【发布时间】:2011-12-16 19:23:31
【问题描述】:

我有一个在 Glassfish 下运行的 Java EE 应用程序。

在最近的一些更改之后,我们开始在日志中看到大量语句:

[#|2011-12-16T11:20:27.007-0800|INFO|sun-appserver9.1|javax.enterprise.system.stream.out|_ThreadID=19;_ThreadName=Thread-62;|2011-12-16 11:20:27,007 DEBUG org.apache.commons.httpclient.HttpConnection[Thread-62] - enter HttpConnection.closeSockedAndStreams()
|#]

[#|2011-12-16T11:20:32.007-0800|INFO|sun-appserver9.1|javax.enterprise.system.stream.out|_ThreadID=19;_ThreadName=Thread-62;|2011-12-16 11:20:32,007 DEBUG org.apache.commons.httpclient.HttpConnection[Thread-62] - enter HttpConnection.close()

我们设置了 log4j.properties 试图让这些保持沉默

log4j.logger.org.apache.commons.httpclient=WARN

但这不起作用。如何找到这些日志语句的来源或来源?我想我想要的是一个堆栈跟踪,它告诉我正在调用什么代码来导致这个日志语句。

也许这里的东西会有所帮助? http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

更重要的是,我怎样才能关闭这些语句?他们正在污染我们的日志。

【问题讨论】:

  • 您确定它正在使用您的属性文件吗?当然看起来不像,因为您所拥有的在正常情况下可以正常工作。
  • 我不确定它是否在使用我的属性文件。有没有便宜的测试可以用来判断它是否是?
  • 另一条信息,这条语句每隔 5 秒就会出现一次。
  • 您的文件在哪里?你确定正在使用 log4j?
  • ... 是的。 在哪里?再说一遍,你确定正在使用 log4j 吗?

标签: java jakarta-ee glassfish log4j


【解决方案1】:

因为在你的类路径中显然有其他东西覆盖了 你的 设置,你可以抓住记录器并将其重新设置。比如:

import org.apache.log4j.*;
...
Logger offendingLogger = Logger.getLogger("org.apache.commons.httpclient.HttpConnection");
offendingLogger.setLevel(Level.WARN);

【讨论】:

  • 拥有记录器后,我可以做些什么(也许在调试器中?)以找出可能覆盖我的设置的内容吗?
  • 不怕。 Log4J 不跟踪谁或什么设置了级别。很可能是您介绍了 log4j.properties 告诉 log4j where 发送 Glassfish 的日志语句。 blogs.oracle.com/naman/entry/configure_log4j_for_use_in 提出了一种隔离消息的方法。
  • 我尝试将此调用添加到我的应用程序中的类中,但行为没有任何变化。我认为这告诉我的是,就像 log4j.properties 一样,它是一个找到正确位置的问题。
【解决方案2】:

解决这个问题的方法比我预期的要简单得多。

我发现我可以将这个参数-Dlog4j.debug=true 传递给JVM。它会让 log4j 告诉我它从哪里加载配置。

看起来像这样:

log4j: Using URL [jar:file:/C:/Sun/GF2/domains/domain1/applications/j2ee-apps/MyProject/lib/omar.jar!/log4j.properties] for automatic log4j configuration.|#]
...
Parsing for [root] with value=[trace, stdout, R].|#]

我发现我的类路径中的 JAR 与一个 log4j.properties 文件(SLOPPY!)打包在一起,该文件的根记录器设置为 TRACE。

【讨论】:

  • 啊,是的……一个不幸的默认选择;至少它可以被覆盖或以其他方式处理。很好的发现。
  • 这是一个不需要更改单行代码的建议。考虑将您的日志更改为SLF4JLogback。它们是由做 log4j 的同一个人编写的。 SLF4J 可以使用其他框架拦截日志语句。只需将 log4j.jar 替换为 log4j-over-slf4j.jar,所有对 log4j 的日志调用都将通过 SLF4J 路由到您选择的记录器。 Logback 很像 log4j,只是更好。配置 logback(通过 logback.xml)以记录您想要的内容,您不必担心其他记录器的配置。
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2013-11-08
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多