【问题标题】:Log4J does not log anythingLog4J 不记录任何内容
【发布时间】:2012-07-01 08:37:00
【问题描述】:

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

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

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

我已经检查了配置文件和属性文件,一切看起来都OK。我怀疑 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),可能已经包含必要的日志记录配置,也许这​​就是区别所在。

我还尝试使用来自这个问题:Websphere all logs are going to SystemOut.log 但似乎没有帮助。

【问题讨论】:

  • 它是什么类型的记录器实例?和 RollingFileAppender 一样
  • @Woot4Moo:这是一个 FileAppender。
  • 我会开始在 log4j 配置文件中引入一个错误,因此它会在初始化期间爆炸,只是为了验证文件正在被读取。
  • @FrustratedWithFormsDesigner Log4j 因不从您认为正在读取的配置文件中读取而臭名昭著。 (或者更确切地说,写得不好的应用程序因以这种方式滥用 log4j 而臭名昭著。)我要做的是在 log4j 配置类中放置断点,以查看调用了哪个以及它们从哪里读取。
  • 太棒了!您发现了 WAS 中最奇怪的错误来源之一。一个快速的解决方法是将公共日志添加到您的应用程序中。

标签: java log4j websphere rad websphere-7


【解决方案1】:

看到这个答案: How to initialize log4j properly?

-Dlog4j.debug 对于此类问题非常有用

【讨论】:

  • 嗯,我必须在星期一看看。
【解决方案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)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        无法创建日志文件,我在 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>
        

        【讨论】:

          【解决方案6】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2014-02-11
            • 2012-09-22
            • 2013-11-24
            • 1970-01-01
            • 2021-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多