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

Я убедился, что мой файл log4j.properties находится в моем каталоге WEB-INF / classes, а файлы jar 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>
13
задан kgrad 10 August 2010 в 14:12
поделиться

6 ответов

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

И когда я запускаю проект с плагином embedded-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. ***
********************************************************************

Интересно, это показательно или нет?


Я проверил 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:

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

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

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

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

6
ответ дан 2 December 2019 в 00:44
поделиться

Две наиболее вероятные вещи, которые возникают на ум следующие:

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

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

0
ответ дан 2 December 2019 в 00:44
поделиться

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

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

1
ответ дан 2 December 2019 в 00:44
поделиться

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

1
ответ дан 2 December 2019 в 00:44
поделиться

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

0
ответ дан 2 December 2019 в 00:44
поделиться

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

<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

в надежде, что это помогло

0
ответ дан 2 December 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: