8

我刚刚在工作中挑选了一个现有的 Web 应用程序,它应该使用 Log4J 记录其活动。我已经完全按照我被告知的方式配置了我的工作区,其他一切(数据库连接、身份验证等)都可以正常工作,只是没有将任何内容写入日志文件。其他类似的应用程序记录没有问题。

当应用程序启动时,我查看了 WebSphere 控制台,那里没有任何错误可能表明 Log4J 没有记录的原因。

我向另一位开发人员提到了这一点(他曾经在这个应用程序上工作过,但没有一段时间,而且比我现在更过时),他说这是非常奇怪的行为,但不知道为什么它可能无法登录并且不报告任何错误。

我已经检查了配置文件和属性文件,一切看起来都很好。我怀疑 Log4J 甚至从未读取过 log4j.xml,但我不确定。自从我使用 Log4J 以来已经有一段时间了 - 有没有人有一些关于解决这类问题的好技巧?

PS:有这个应用程序的实例部署到各种测试/QA/prod 服务器,这些实例都可以正常记录。在本地工作站上,日志记录似乎静默失败。


更新:因此,应用程序的部署方式似乎确实存在问题。我将类加载器模式更改为“Parent Last”,我可以看到至少现在正在读取 Log4J 文件。我尝试的第一个动作触发了一个找不到的ClassNotFoundException说法。org.apache.commons.logging.impl.Log4jFactory


第二次更新: 我注意到了一些奇怪的事情......该应用程序有两个 WAR 项目 - 其中一个用于 UI,另一个用于某些 Web 服务。用于 UI 的项目正在成功地将其操作记录到日志文件中。Web 服务项目是失败的ClassNotFoundException. 它们都将 commons-logging.jar 列为 JavaEE 模块依赖项,并且它们都没有特定于项目的日志记录配置(所有配置文件都在 Resources 项目中)。

一个主要的区别是该 UI 项目包括一些其他内部框架(预编译为 JAR),这些框架可能已经包括必要的日志配置,也许这​​就是区别所在。

我还尝试使用此问题的答案(META-INF/services 中名为 org.apache.commons.logging.LogFactory 的文件,其中一行包含:“org.apache.commons.logging.impl.Log4jFactory”):Websphere 所有日志都将转到 SystemOut.log,但似乎没有帮助。

4

6 回答 6

13

请参阅此答案: 如何正确初始化 log4j?

-Dlog4j.debug 对于这样的问题非常有用

于 2012-06-29T23:19:47.273 回答
2

我最近更改的最终使日志记录正常工作的是将类加载器模式更改为“PARENT_FIRST”,将 WAR 类加载器策略更改为“应用程序”。初始默认配置是“PARENT_FIRST”/“模块”。我根据一位同事的建议将其更改为“PARENT_LAST”/“Application”,他说日志记录对他们来说很好,这是他们在为此应用程序创建新沙箱时必须进行的唯一更改。我不确定为什么我必须使用“PARENT_FIRST”/“Application”,但至少它现在可以工作了。


更新:

我尝试设置一个新的工作区,但我遇到了同样的问题。事实证明,您需要“PARENT_FIRST”/“Application”和 META-INF/services 中名为 org.apache.commons.logging.LogFactory 的文件,其中一行包含:“org.apache.commons.logging.impl.Log4jFactory” . 没有该文件会导致日志记录失败(通常会显示一条消息,指出找不到 Log4J)。

于 2012-07-04T21:23:36.620 回答
0

我意识到这不是您完全相同的症状,但是如果您的应用程序(或它使用的任何东西)使用 Commons Logging,log4j 就会出现已知问题。看看这个问题/答案是否相关。

于 2012-07-02T13:30:24.193 回答
0

无法创建日志文件,我在 spring webservice 应用程序中使用了 logback.xml 文件并部署到 websphere 服务器中......但是当我使用 log4j.properties 文件时,它正在创建日志文件。我已经为 log4j 和 slf4j.. logback.xml 文件提供了适当的依赖关系

<file>C:/abc/myLogFile.log</file>
<append>true</append>
<encoder>
  <pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder></appender>

`

依赖:

<dependency>
    <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>${logback.version}</version>
    </dependency>
于 2014-08-25T09:39:17.943 回答
0

我遇到了一个问题,log4j 在我的一个项目中没有显示任何内容。原来我在 log4j2.xml 文件的类名中添加了一个前导空格。Log4j 按类名进行字典查找。因此,类名中的任何前导或尾随空格都会使该特定条目无效。

于 2015-06-09T20:57:26.683 回答
0

只是我的两美分 - 我发生了这样的事情 - 但在我的情况下,我可以看到我的日志调用的一些输出。很明显,配置是从其他地方获取的,而我正在更改的配置没有任何影响。

在按照此处的建议打开 -Dlog4j.debug=true 后,很明显 log4j 正在获取一个名为 log4j.xml 的文件,该文件位于我的 tomcat 的工作目录中。它要么是我正在做的其他事情的遗留物,要么是从我配置错误的库中的某个 log4j 配置中以某种方式生成的。

我没有想过擦除工作目录的内容(可以尝试过.. [编辑:我尝试过但没有用])-我唯一想到的就是通过 -Dlog4j 将硬编码引用传递给我的属性文件.configuration=log4j.properties (不想使用绝对路径)(碰巧我使用的是属性文件而不是 xml) - 它有效。

[编辑:好吧,它不适用于服务器配置。我终于发现了问题所在 - 我作为 JAR 包含在项目中的一些自制库有自己的 log4j.xml 和 log4j.properties 文件,这些文件显然比我自己的属性文件更早被读取/找到 - 最正确的事情是从 JAR 中删除这些多余的属性文件]

于 2019-11-26T08:29:31.393 回答