Log4j.properties игнорируются

У меня есть приложение Java EE 6 Wicket, развернутое с maven с использованием IntelliJ IDEA 9.0.3 на Glassfish v3.0.1. Я использую slf4j-log4j12-1.5.6 с slf4j-api-1.5.8 и log4j-1.2.16 для ведения журнала.

Раньше он работал нормально, когда я развертывал через netbeans или eclipse, однако при развертывании с IntelliJ IDEA мой файл log4j.properties игнорируется, и ведение журнала в лог файлах обрабатывает мои сообщения журнала. Я не думаю, что IDEA имеет к этому какое-то отношение, что-то еще должно измениться, я просто не могу понять, что.

Я подтвердил, что файл log4j.properties находится в моем каталоге WEB-INF/classes, а банки slf4j/log4j находятся в каталоге WEB-INF/lib моей войны. Есть ли какая-то конфигурация, которую мне не хватает, чтобы сделать эту работу?

спасибо.

edit: Обновлено с дополнительной информацией, размещены зависимости 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>

Ответы

Ответ 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 вам не нужно объявлять их все, использовать механизм транзитивных зависимостей.
  • Я добавил соответствующие repositories и pluginRepositories
  • Я добавил зависимость javax.servlet от Glassfish, чтобы сделать сборку сборки
  • Я добавил плагин 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>

И когда я запускаю проект с помощью встроенного плагина-плагина:

$ 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:

Связывание с фреймворком регистрации во время развертывания

Как упоминалось ранее, SLF4J поддерживает различные структуры ведения журнала. Распределение SLF4J распространяется с несколько файлов jar, называемых "Связывание SLF4J", с каждой привязкой соответствующей поддерживаемой рамки.

slf4j-log4j12-1.6.1.jar: привязка для log4j версия 1.2, широко используемая. Вы также должны поместите log4j.jar в свой путь к классу.

Интересно, как вы это работали в среде NetBeans и Eclipse.

Ответ 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 (если это то, что вы используете), вы можете добавить ту же строку к аргументам Run Configuration/VM.

Ответ 3

У меня были те же проблемы. Решение прост - все зависимости от журналов должны быть до стеклянной рыбы на пути к классам.

Обратите внимание, что у старых версий Maven2 есть некоторые проблемы с последовательностью классов. Я использую 2.2.1, у которого исправлена ​​эта проблема (я думаю, это было исправлено в 2.0.9).

Ответ 4

Посмотрите log4j manual. В разделе "Процедура инициализации по умолчанию" описано, как log4j попытается найти файл инициализации. Возможно, вы можете попробовать некоторые из этих вариантов, чтобы заставить все работать.

Ответ 5

Я предлагаю удалить все зависимости slf4j и изменить свой код ведения журнала, чтобы использовать API Log4j напрямую (если это не так много работы, не знаете размер вашего проекта). Как только это сработает, подумайте, действительно ли вам нужна гибкость, предлагаемая slf4j. Если вы это сделаете, подберите правильную версию slf4j (slf4j-log4j12 может быть неправильной для использования для log4j 1.2.16) и интегрировать ее обратно.

Недавно я столкнулся с slf4j и, в конце концов, полностью удалил его, потому что столкнулся с аналогичными проблемами конфигурации.

Ответ 6

Две наиболее вероятные вещи, которые spring должны учитывать:

  • убедитесь, что файл log4j.properties находится в WEB-INF/классах развертывания. Я предполагаю, что вы имеете в виду, что это в ваших WEB-INF/классах в вашей кодовой базе, но подтвердили ли вы это в случае войны, которая была отправлена ​​в стеклянную рыбку.
  • убедитесь, что ваш log4j.jar находится в развернутом WEB-INF/lib

Поскольку он работает в некоторых сценариях развертывания, я подозреваю, что ваша военная упаковка при работе через Maven является проблемой. Вышеуказанные пункты должны помочь вам подтвердить это.

Ответ 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/i имеет logback.xml, определяющий различные аспекты (appenders,..). Это подхватывается maven и копируется в WEB-INF/classes

надеюсь, что это помогло

Ответ 8

Я бы поддержал ответ Адриана Костера. Если ваш чистый 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 из classloader:

url = classLoader.getResource(resource);      

Итак, вы можете легко найти внутри загрузчика классов и посмотреть, какие пути он использует (и почему он не может найти ваш log4j.xml).

Ответ 9

Также очень важно, чтобы библиотека log4j была скомпилирована после всех модулей библиотек, используемых в проекте. Если вы не укажете его как последний объект, журналы из более поздних модулей/библиотек не будут отображаться стандартным способом для log4j.properties.