代码之家  ›  专栏  ›  技术社区  ›  kgrad

log4j.忽略的属性

  •  13
  • kgrad  · 技术社区  · 14 年前

    在GalasFISS V3.0.1中,我使用Maven部署了一个JavaEE 6 WiKET应用程序。我使用slf4j-log4j12-1.5.6和slf4j-api-1.5.8和log4j-1.2.16进行测井。

    以前我通过netbeans或eclipse部署时它工作得很好,但是当我使用intellij思想部署时,log4j.properties文件被忽略,glassfish的日志记录处理我的日志消息。我不认为这个想法和它有任何关系,一定是别的东西改变了,我只是不知道是什么。

    我已经验证了log4j.properties文件在web-inf/classes目录中,slf4j/log4j jars在我的war的web-inf/lib目录中。是否有某种类型的配置丢失了以使此工作正常?

    谢谢。

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

    以下是my 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>
    
    9 回复  |  直到 7 年前
        1
  •  6
  •   Pascal Thivent    14 年前

    更新: 我试图重现这个问题。我创建了一个简单的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依赖项中,您不需要全部声明它们,利用可传递的依赖机制
    • 我添加了相关的 repositories pluginRepositories
    • 我加了玻璃鱼 javax.servlet 使生成通过的依赖项
    • 我添加了 embedded-glassfish 测试整个事情的插件
    • 我做了一些其他不相关的改变
      • 我将编译器设置更改为1.6
      • 我宣布 slf4j-api dependencyManagement 元素来很好地控制可传递依赖项中的版本。

    完整的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>
    

    当我使用嵌入的glassfish插件运行项目时:

    $ mvn package
    ...
    $ mvn embedded-glassfish:run
    ...
    

    和访问 http://localhost:8080/server 在浏览器中,我按预期在标准输出中获取日志:

    ...
    INFO: [WicketApplication] Started Wicket version 1.4.9 in development mode
    ********************************************************************
    *** WARNING: Wicket is running in DEVELOPMENT mode.              ***
    ***                               ^^^^^^^^^^^                    ***
    *** Do NOT deploy to your live server(s) without changing this.  ***
    *** See Application#getConfigurationType() for more information. ***
    ********************************************************************
    

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


    我查过战争,log4j.properties确实在WEB-INF/类中。我没有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下工作的。

        2
  •  3
  •   electrotype    13 年前

    我也有同样的问题。

    单独使用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
  •  2
  •   dmatej    14 年前

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

    请注意,旧的maven2版本在类路径一致性方面存在一些问题。我使用的是2.2.1,它修复了这个问题(我想是在2.0.9中修复的)。

        4
  •  1
  •   Adriaan Koster    14 年前

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

    我最近遇到了slf4j,最后完全删除了它,因为我遇到了类似的配置问题。

        5
  •  1
  •   Danny Bullis    7 年前

    看看 log4j manual . “默认初始化过程”一节描述log4j如何尝试查找初始化文件。也许你可以尝试一些这样的选择来让事情正常运转。

        6
  •  0
  •   Paul Jowett    14 年前

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

    1. 确保log4j.properties文件位于部署的WEB-INF/类中。我想你的意思是,它在你的代码库的WEB-INF/类中,但是你确认了这是发送给Glassfish的战争中的情况吗?
    2. 确保log4j.jar在部署的WEB-INF/lib中

    因为它在一些部署场景中工作,所以我怀疑通过maven运行时您的战争包是问题所在。以上几点有助于您确认这一点。

        7
  •  0
  •   bert    14 年前

    我有以下日志记录依赖项:

    <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/i下有一个logback.xml定义了各个方面(appenders,)。这将由Maven收集并复制到WEB-INF/类

    希望有帮助

        8
  •  0
  •   Denys Kniazhev-Support Ukraine    14 年前

    我支持阿德里安·科斯特的回答。但是,如果您的纯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
  •  0
  •   Michał Rowicki    10 年前

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