к log4j.свойства игнорируются

У меня есть приложение 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.файл свойств игнорируется, и журнал glassfish обрабатывает мои сообщения журнала. Я не думаю, что идея имеет к этому какое-то отношение, что-то еще должно было измениться. просто не могу понять, что.

Я проверил, что мой log4j.файл свойств находится в моем каталоге 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>

9 ответов


обновление: Я попытался воспроизвести проблему. Я создал простой проект калитки (та же версия, что и вы):

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

который имеет простой log4j.свойства вход в стандартный вывод.

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
  • я добавил зависимость, чтобы сделать проход сборки
  • добавил embedded-glassfish плагин, чтобы проверить все
  • я сделал несколько других изменений
    • я изменил настройки компилятора для 1.6
    • заявил slf4j-api на dependencyManagement элемент для управления красиво версия в transitive зависимости.

полный 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.свойства действительно находятся в WEB-INF/classes. У меня нет log4j.jar я slf4j-log4j12.сосуд.

slf4j-log4j12.jar не является заменой для log4j.jar, slf4j-log4j12.банке обязательные для версии 1.2 log4J, вам все еще нужно log4j.jar - ... Из документации SLF4J:

привязка с фреймворком ведения журнала во время развертывания

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

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

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


у меня была точно такая же проблема.

Log4j в одиночку отлично работает:

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

но если я попытаюсь использовать Slf4j над ним, то мой " src / resources / log4j.файл "свойства" больше не найден, даже если 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.свойства " к пути к классам или сообщите серверу, где его найти! Путь для достижения этого (этот пример находится в Windows):

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

в Eclipse (если это то, что вы используете), вы можете добавить ту же строку в аргументы Run Configuration / VM.


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

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


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

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


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


две наиболее вероятные вещи, которые приходят на ум:

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

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


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

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

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


Я бы поддержал ответ Адриана Костера. Если ваш чистый 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.апаш.к log4j.хелперов.Способ заряжания#методу getresource. Он пытается вытащить log4j.xml от загрузчика:

url = classLoader.getResource(resource);      

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


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