Log4J不记录任何内容

时间:2012-06-29 19:53:44

标签: java log4j websphere rad websphere-7

我刚刚在工作中选择了一个应该使用Log4J记录其活动的现有Web应用程序。我完全按照我的要求配置了我的工作区,其他所有内容(数据库连接,身份验证等等)工作正常,只是没有任何内容写入日志文件。其他类似的应用程序没有问题日志。

我在应用程序启动时查看了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 all logs are going to SystemOut.log但它似乎没有帮助。

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

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


更新:

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

答案 2 :(得分:0)

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

答案 3 :(得分: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>

答案 4 :(得分:0)

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

答案 5 :(得分:0)

只有两美分-我发生了类似的事情-但就我而言,我可以从日志记录调用中看到一些输出。显然,该配置是从其他地方获取的,而我正在更改的配置没有任何影响。

按照此处的建议打开-Dlog4j.debug = true后,很明显log4j正在选择一个位于tomcat工作目录中的名为log4j.xml的文件。它要么是我正在做的其他事情的剩余物,要么是由于我配置错误的库之一中的某些log4j配置而生成的。

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

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