log4j.properties игнорируется - PullRequest
       23

log4j.properties игнорируется

13 голосов
/ 10 августа 2010

У меня есть приложение 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>

Ответы [ 9 ]

6 голосов
/ 10 августа 2010

Обновление: Я попытался воспроизвести проблему.Я создал простой проект 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
  • Я добавил Glassfish'sjavax.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:

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

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

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

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

3 голосов
/ 18 февраля 2012

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

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

2 голосов
/ 28 марта 2011

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

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

1 голос
/ 19 августа 2010

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

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

1 голос
/ 17 августа 2010

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

0 голосов
/ 04 августа 2014

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

0 голосов
/ 19 августа 2010

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

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

<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

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

0 голосов
/ 10 августа 2010

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

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

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

...