【问题标题】:log4j.properties being ignoredlog4j.properties 被忽略
【发布时间】:2011-03-27 13:04:42
【问题描述】:

我在 glassfish v3.0.1 上使用 IntelliJ IDEA 9.0.3 通过 maven 部署了 Java EE 6 Wicket 应用程序。我使用 slf4j-log4j12-1.5.6 和 slf4j-api-1.5.8 和 log4j-1.2.16 进行日志记录。

当我通过 netbeans 或 eclipse 部署时,它以前工作正常,但是当我使用 IntelliJ IDEA 部署时,我的 log4j.properties 文件被忽略,glassfish 的日志记录处理我的日志消息。我不认为 IDEA 与它有任何关系,其他东西一定已经改变了,我只是不知道是什么。

我已验证我的 log4j.properties 文件位于我的 WEB-INF/classes 目录中,并且 slf4j/log4j jar 位于我的 war 的 WEB-INF/lib 目录中。我是否缺少某种配置来完成这项工作?

谢谢。

编辑:更新了更多信息,发布了 pom 依赖项。

这是我的 pom.xml 中的相关部分:

    <!-- Guava -->

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>r05</version>
    </dependency>

    <!-- Test -->

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.7</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.0</version>
        <scope>test</scope>
    </dependency>

    <!-- Java EE 6 -->

    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>bean-validator</artifactId>
        <version>3.0-JBoss-4.0.0.Beta3</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- Wicket -->

    <dependency>
        <groupId>org.apache.wicket</groupId>
        <artifactId>wicket</artifactId>
        <version>1.4.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.wicket</groupId>
        <artifactId>wicket-auth-roles</artifactId>
        <version>1.4.9</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.weld</groupId>
        <artifactId>weld-wicket</artifactId>
        <version>1.0.1-Final</version>
    </dependency>

    <!-- Hibernate -->

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.5.1-Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.5.1-Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>3.2.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.5.1-Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>3.5.1-Final</version>
    </dependency>


    <!-- Database -->

    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>8.4-701.jdbc4</version>
    </dependency>


    <!-- Logging -->

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.6</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>

</dependencies>

【问题讨论】:

  • 你能发布 log4j.debug=true 输出吗?
  • @antismap - 我在 gfv3 jvm 设置中设置了 -Dlog4j.debug 但是它被立即忽略了。
  • System.getProperty("log4j.defaultinitoverride") 返回什么?

标签: java maven-2 log4j intellij-idea wicket


【解决方案1】:

更新:我试图重现该问题。我创建了一个简单的 Wicket 项目(与您的版本相同):

mvn archetype:create \
-DarchetypeGroupId=org.apache.wicket \
-DarchetypeArtifactId=wicket-archetype-quickstart \
-DarchetypeVersion=1.4.9 \
-DgroupId=com.mycompany \
-DartifactId=my-wicketapp 

其中有一个简单的 log4j.properties 记录到标准输出。

log4j.appender.Stdout=org.apache.log4j.ConsoleAppender
log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Stdout.layout.conversionPattern=%-5p - %-26.26c{1} - %m\n

log4j.rootLogger=INFO,Stdout

log4j.logger.org.apache.wicket=INFO
log4j.logger.org.apache.wicket.protocol.http.HttpSessionStore=INFO
log4j.logger.org.apache.wicket.version=INFO
log4j.logger.org.apache.wicket.RequestCycle=INFO

然后:

  • 我添加了您所有的依赖项(或修改了现有依赖项的版本以匹配您的)
    • 我刚刚做了一些清理工作,例如在 Hibernate 依赖中,你不需要全部声明它们,利用传递依赖机制
  • 我添加了相关的repositoriespluginRepositories
  • 我添加了 glassfish 的 javax.servlet 依赖项以使构建通过
  • 我添加了embedded-glassfish 插件来测试整个事情
  • 我做了一些其他不相关的更改
    • 我将编译器设置更改为 1.6
    • 我在 dependencyManagement 元素中声明了 slf4j-api 以很好地控制传递依赖项中的版本。

完整的 pom.xml 如下所示(因此任何人都可以重现):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany</groupId>
  <artifactId>my-wicketapp</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <!-- TODO project name  -->
  <name>quickstart</name>
  <description/>
  <!--
        TODO <organization> <name>company name</name> <url>company url</url>
        </organization>
    -->
  <licenses>
    <license>
      <name>The Apache Software License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <repositories>
    <!-- For Hibernate Artifacts -->
    <repository>
      <id>repository.jboss.org-public</id>
      <name>JBoss repository</name>
      <url>https://repository.jboss.org/nexus/content/groups/public</url>
    </repository>
    <!-- repository for Java EE 6 Binaries -->
    <repository>
      <id>java.net2</id>
      <name>Repository hosting the jee6 artifacts</name>
      <url>http://download.java.net/maven/2</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <!-- GlassFish repository for the embedded-glassfish plugin -->
    <pluginRepository>
      <id>glassfish</id>
      <name>GlassFish Maven 2 Repository</name>
      <url>http://download.java.net/maven/glassfish</url>
    </pluginRepository>
  </pluginRepositories>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>3.5.5-Final</version>
    </dependency>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>r05</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.servlet</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>bean-validator</artifactId>
      <version>3.0-JBoss-4.0.0.Beta3</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
    <!--  WICKET DEPENDENCIES -->
    <dependency>
      <groupId>org.apache.wicket</groupId>
      <artifactId>wicket</artifactId>
      <version>${wicket.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.wicket</groupId>
      <artifactId>wicket-auth-roles</artifactId>
      <version>${wicket.version}</version>
    </dependency>
    <dependency>
      <groupId>org.jboss.weld</groupId>
      <artifactId>weld-wicket</artifactId>
      <version>1.0.1-Final</version>
    </dependency>
    <!--
            OPTIONAL <dependency> <groupId>org.apache.wicket</groupId>
            <artifactId>wicket-extensions</artifactId>
            <version>${wicket.version}</version> </dependency>
        -->
    <!-- LOGGING DEPENDENCIES - LOG4J -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.16</version>
    </dependency>
    <!--  JUNIT DEPENDENCY FOR TESTING -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
    <!-- GLASSFISH EMBEDDED FOR TESTING -->
    <dependency>
      <groupId>org.glassfish.extras</groupId>
      <artifactId>glassfish-embedded-all</artifactId>
      <version>3.0.1</version>
      <scope>test</scope>
    </dependency>
    <!--  JETTY DEPENDENCIES FOR TESTING  -->
    <dependency>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>jetty</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>jetty-util</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>jetty-management</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <resources>
      <resource>
        <filtering>false</filtering>
        <directory>src/main/resources</directory>
      </resource>
      <resource>
        <filtering>false</filtering>
        <directory>src/main/java</directory>
        <includes>
          <include>**</include>
        </includes>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <filtering>false</filtering>
        <directory>src/test/java</directory>
        <includes>
          <include>**</include>
        </includes>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </testResource>
    </testResources>
    <plugins>
      <plugin>
        <inherited>true</inherited>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <optimize>true</optimize>
          <debug>true</debug>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
          <downloadSources>true</downloadSources>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.glassfish</groupId>
        <artifactId>maven-embedded-glassfish-plugin</artifactId>
        <version>3.0.1</version>
        <configuration>
          <serverID>server</serverID>
          <name>server</name>
          <app>${project.build.directory}/${project.build.finalName}.war</app>
          <port>8080</port>
          <instanceRoot>${project.build.directory}/gfe-${maven.build.timestamp}</instanceRoot>
          <!--contextRoot>${build.finalName}</contextRoot-->
          <autoDelete>true</autoDelete>
          <!--configFile>${basedir}/domain.xml</configFile-->
        </configuration>
      </plugin>
    </plugins>
  </build>
  <properties>
    <wicket.version>1.4.9</wicket.version>
    <jetty.version>6.1.4</jetty.version>
    <slf4j.version>1.5.6</slf4j.version>
  </properties>
</project>

当我使用 Embedded-glassfish 插件运行项目时:

$ mvn 包 ... $ mvn 嵌入式玻璃鱼:运行 ...

并在浏览器中访问http://localhost:8080/server,我的日志按预期显示在标准输出中:

... INFO: [WicketApplication] 以开发模式启动 Wicket 1.4.9 版 ****************************************************** ****************** *** 警告:Wicket 正在开发模式下运行。 *** *** ^^^^^^^^^^^ *** *** 不要在不更改此设置的情况下部署到您的实时服务器。 *** *** 有关详细信息,请参阅 Application#getConfigurationType()。 *** ****************************************************** ******************

我想知道这是否具有代表性。


我检查了war,log4j.properties确实在WEB-INF/classes中。我没有log4j.jar,我有slf4j-log4j12.jar。

slf4j-log4j12.jar 不是 log4j.jar 的替代品,slf4j-log4j12.jar 是 log4J 1.2 版的绑定,你仍然需要 log4j.jar。来自 SLF4J 文档:

Binding with a logging framework at deployment time

如前所述,SLF4J 支持各种日志框架。 SLF4J 发行版附带 几个jar文件称为 “SLF4J 绑定”,每个绑定 对应于支持的 框架。

slf4j-log4j12-1.6.1.jar:绑定 log4j 1.2 版,一个被广泛使用的 日志框架。你还需要 将 log4j.jar 放在你的类路径上。

我想知道您是如何在 NetBeans 和 Eclipse 下完成这项工作的。

【讨论】:

  • 我将 log4j-1.2.14 添加到我的 maven 依赖项中,不走运,我验证了 slf4j 和 log4j jar 确实在我的 lib 中,并且 log4j.properties 在我的爆炸战争中的 WEB-INF/classes 中.
  • @Pascal Thivent - 只是为了完全确定我在 netbeans 下再次运行它并且它不再在那里正确记录,这是有道理的,我不知道为什么它突然停止使用我的 log4j 配置.. .也许我添加了一个冲突的依赖项?粘贴我的 pom 有帮助吗?
  • @kgrad:发布你的 pom 至少有助于检查依赖关系。
  • @Pascal Thivent:我更改了我的记录器代码以包含 org.apache.log4j.Logger 并使用 Logger.getLogger() 来测试发生了什么。现在我的文件附加程序创建了一个文件,但是该文件是空的,并且服务器日志仍在使用 glassfish 的记录器。 Glassfish 似乎在劫持我的记录器实例并以某种方式使用它自己的实例。我知道它至少会在创建文件时读取我的配置,虽然是空的...
  • @kgrad:今晚我将运行一个简单的测试(但我已经可以告诉你,我在我的应用程序中使用带有 SFL4F 的 GlassFish 3 没有任何问题)。
【解决方案2】:

我遇到了完全相同的问题。

单独使用 Log4j 效果很好:

<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.16</version>
</dependency>

但是如果我尝试在它上面使用 Slf4j,那么我的“src/resources/log4j.properties”文件就找不到了,即使 Maven 将它添加到类路径上的目录中.

所以,这不是开箱即用的:

<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.16</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.4</version>
</dependency>
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jcl-over-slf4j</artifactId>
   <version>1.6.4</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>1.6.4</version>
</dependency>
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.6.4</version>
</dependency>

要让它工作,你必须明确地将“log4j.properties”添加到类路径中,或者告诉服务器在哪里可以找到它!实现这一点的一种方法是(此示例在 Windows 上):

-Dlog4j.configuration=file:C:\[pathToYourProject]\trunk\target\classes\log4j.properties

在 Eclipse 中(如果这是您使用的),您可以将同一行添加到您的运行配置/VM 参数中。

【讨论】:

    【解决方案3】:

    我也有同样的问题。解决方案很简单 - 所有日志记录依赖项都应该在类路径上的 glassfish 之前。

    请注意,较旧的 Maven2 版本在类路径一致性方面存在一些问题。我使用 2.2.1 已修复此问题(我认为它已在 2.0.9 中修复)。

    【讨论】:

      【解决方案4】:

      我建议删除所有 slf4j 依赖项并更改您的日志记录代码以直接使用 Log4j API(如果这不是太多工作,不知道您的项目的大小)。一旦这可行,请考虑您是否真的需要 slf4j 提供的灵活性。如果这样做,请选择正确版本的 slf4j(slf4j-log4j12 可能不是用于 log4j 1.2.16 的正确版本)并将其重新集成。

      我最近遇到了slf4j,最后因为遇到类似的配置问题把它干掉了。

      【讨论】:

        【解决方案5】:

        看看log4j manual。 “默认初始化过程”部分描述了 log4j 将如何尝试查找初始化文件。也许您可以尝试其中一些选项来让事情顺利进行。

        【讨论】:

          【解决方案6】:

          最有可能想到的两件事是:

          1. 确保 log4j.properties 文件位于部署的 WEB-INF/classes 中。我假设您的意思是它在您的代码库中的 WEB-INF/类中,但是您是否确认这是发送给 glassfish 的战争中的情况
          2. 确保您的 log4j.jar 在您部署的 WEB-INF/lib 中

          由于它在某些部署场景中工作,我怀疑您通过 Maven 运行时的战争打包是问题所在。以上几点应该可以帮助您确认这一点。

          【讨论】:

          • jowierun - 我检查了战争,log4j.properties 确实在 WEB-INF/classes 中。我没有 log4j.jar,我有 slf4j-log4j12.jar。奇怪的是,在我们切换到 IDEA 之前,这个确切的配置在 netbeans 和 eclipse 中都能正常工作。
          • 当我想要重现性时,我从命令行运行 maven 并手动部署 WAR 文件。或许您应该尝试一下,并将以这种方式创建的 WAR 文件与相应 IDE 创建/部署的 WAR 文件进行比较。
          • @Stephen C - 我通过命令行部署了战争并检查了 server.log,但仍然没有看到 log4j 正常工作,我的文件附加程序也没有工作。
          • @kgrad - 以防万一,您是否在启动输出中查找过任何错误?过去,我已经看到隐藏在大量应用服务器启动中的错误。此外,可能值得在部署中从类或 JSP 中转储类路径 - 这应该确认您可以访问哪些 Jars。
          • @kgrad - 您是否按照@jowierun 的指示检查了 log4j.jar 文件是否在 WAR 文件中?
          【解决方案7】:

          我有以下日志依赖项:

          <dependency>
                  <groupId>ch.qos.logback</groupId>
                  <artifactId>logback-classic</artifactId>
                  <version>0.9.17</version>
              </dependency>
          
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-api</artifactId>
                  <version>1.5.8</version>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>jcl-over-slf4j</artifactId>
                  <version>1.5.8</version>
              </dependency>
              <dependency>
                  <groupId>log4j</groupId>
                  <artifactId>log4j</artifactId>
                  <version>1.2.14</version>
                  <scope>runtime</scope>
              </dependency>
          

          在 /src/main/resources/ 下,我有一个 logback.xml 定义了各个方面(附加程序,..)。这被 maven 拾取并复制到 WEB-INF/classes

          希望有所帮助

          【讨论】:

            【解决方案8】:

            我会支持 Adriaan Koster 的回答。但是,如果您的纯 log4j 不起作用,请尝试以下操作。像这样创建简单的类

            import org.apache.log4j.Logger;
            public class LogTest {
                private static Logger log;
            
                public static void main(String[] args) {
                    log = Logger.getLogger(LogTest.class);
                }
            }
            

            ...并在 org.apache.log4j.helpers.Loader#getResource 方法中放置断点。它试图从类加载器中提取 log4j.xml:

            url = classLoader.getResource(resource);      
            

            因此您可以轻松查看类加载器内部并查看它使用了哪些路径(以及为什么它找不到您的 log4j.xml)。

            【讨论】:

              【解决方案9】:

              同样非常重要的是,log4j 库是在项目中使用的库的所有模块之后编译的。如果您不将其设置为最后一个对象,则来自后续模块/库的日志将不会以 log4j.properties 的标准方式显示。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-08-05
                • 1970-01-01
                • 2016-09-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-09-26
                相关资源
                最近更新 更多