web-dev-qa-db-ja.com

log4j.propertiesは無視されます

Glassfishv3.0.1でIntelliJ Java 9.0.3を使用してMavenでデプロイされたIDEA EE 6Wicketアプリケーションがあります。ロギングには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ディレクトリにあり、slf4j/log4jjarが戦争のWEB-INF/libディレクトリにあることを確認しました。これを機能させるために欠落しているある種の構成はありますか?

ありがとう。

編集:より多くの情報で更新され、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>
14
kgrad

更新:問題を再現しようとしました。簡単な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の依存関係では、それらすべてを宣言する必要はなく、推移的な依存関係メカニズムを活用します
  • 関連するrepositoriespluginRepositoriesを追加しました
  • ビルドパスを作成するために、glassfishのjavax.servlet依存関係を追加しました
  • 全体をテストするためにembedded-glassfishプラグインを追加しました
  • 他にもいくつかの無関係な変更を加えました
    • コンパイラの設定を1.6に変更しました
    • 推移的な依存関係のバージョンを適切に制御するために、dependencyManagement要素でslf4j-apiを宣言しました。

完全な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 にアクセスすると、期待どおりに標準出力でログが取得されます。

 ... 
情報:[WicketApplication]開発モードでWicketバージョン1.4.9を開始しました
 ****************** ************************************************** 
 ***警告:Wicketは開発モードで実行されています。 *** 
 *** ^^^^^^^^^^^ *** 
 ***これを変更せずにライブサーバーにデプロイしないでください。 *** 
 ***詳細については、Application#getConfigurationType()を参照してください。 *** 
 ****************************************** ************************** 

これは代表的なものなのかしら。


私は戦争をチェックしました、log4j.propertiesは確かにWEB-INF/classesにあります。私はlog4j.jarを持っていません、私はslf4j-log4j12.jarを持っています。

slf4j-log4j12.jarはlog4j.jarの代わりではありません、slf4j-log4j12.jarはlog4Jバージョン1.2のbindingです、まだlog4jが必要です。瓶。 SLF4Jドキュメントから:

展開時にロギングフレームワークとバインドする

前述のように、SLF4Jはさまざまなロギングフレームワークをサポートしています。 SLF4Jディストリビューションには、「SLF4Jバインディング」と呼ばれるいくつかのjarファイルが付属しており、各バインディングはサポートされているフレームワークに対応しています。

slf4j-log4j12-1.6.1.jar:広く使用されているロギングフレームワークであるlog4jバージョン1.2のバインディング。また、クラスパスにlog4j.jarを配置する必要があります。

NetBeansとEclipseでこれをどのように機能させたのだろうか。

6
Pascal Thivent

私はまったく同じ問題を抱えていました。

Log4jだけでもうまく機能します。

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

しかし、その上でSlf4jを使用しようとすると、Mavenがクラスパス上のisのディレクトリにファイルを追加しても、「src/resources /log4j.properties」ファイルが見つかりません。

したがって、これはそのままでは機能しません。

<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
electrotype

私も同じ問題を抱えていました。解決策は簡単です。すべてのロギング依存関係は、クラスパス上のGlassfishの前にある必要があります。

古いMaven2バージョンには、クラスパスの一貫性にいくつかの問題があることに注意してください。この問題が修正された2.2.1を使用しています(2.0.9で修正されたと思います)。

2
dmatej

log4jマニュアル をご覧ください。 「デフォルトの初期化手順」のセクションでは、log4jが初期化ファイルを検索する方法について説明します。たぶん、あなたは物事を機能させるためにこのオプションのいくつかを試すことができます。

1
FrVaBe

すべてのslf4j依存関係を削除し、Log4j APIを直接使用するようにログコードを変更することをお勧めします(これがそれほど手間がかからない場合は、プロジェクトのサイズがわかりません)。これが機能したら、slf4jが提供する柔軟性が本当に必要かどうかを検討してください。その場合は、正しいバージョンのslf4j(slf4j-log4j12はlog4j 1.2.16に使用する正しいバージョンではない可能性があります)を選択して、統合し直してください。

最近slf4jに遭遇しましたが、同様の構成の問題が発生したため、最終的にはslf4jを完全に削除しました。

1
Adriaan Koster

次のロギング依存関係があります:

<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 /の下に、さまざまな側面(appenders、..)を定義するlogback.xmlがあります。これはMavenによって取得され、WEB-INF/classesにコピーされます。

それが役に立ったことを願っています

0
bert

AdriaanKosterの答えを支持します。ただし、純粋な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
Denis Kniazhev

プロジェクトで使用されたライブラリのすべてのモジュールの後にlog4jライブラリがコンパイルされたことも非常に重要です。これを最後のオブジェクトとして設定しない場合、後のモジュール/ライブラリからのログは、log4j.propertiesの標準的な方法で表示されません。

0
Michał Rowicki

頭に浮かぶ可能性が最も高い2つのことは次のとおりです。

  1. log4j.propertiesファイルがデプロイメントのWEB-INF/classesにあることを確認してください。コードベースのWEB-INF /クラスにあると思いますが、これがGlassfishに送信された戦争の場合であることを確認しましたか
  2. log4j.jarがデプロイされたWEB-INF/libにあることを確認してください

一部のデプロイメントシナリオで機能しているため、Maven経由で実行する場合の戦争パッケージが問題であると思われます。上記の点は、これを確認するのに役立つはずです。

0
Paul Jowett