web-dev-qa-db-ja.com

ロギングを取得できるようにSpringとSLF4Jを構成するにはどうすればよいですか?

ログインしたいMavenとSpringのアプリがあります。SLF4Jを使用したいと思っています。

すべての構成ファイルをlog4j.xmlを含むディレクトリ{classpath}/configに配置し、Spring Beanを使用して初期化します。

例えば.

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="org.springframework.util.Log4jConfigurer"/>
    <property name="targetMethod" value="initLogging"/>
    <property name="arguments">
        <list>
            <value>classpath:config/log4j.xml</value>
        </list>
    </property>
</bean>

ただし、この警告が表示され、ログは記録されません。

log4j:WARNロガー(org.springframework.context.support.ClassPathXmlApplicationContext)のアペンダーが見つかりませんでした。 log4j:WARN log4jシステムを適切に初期化してください。 log4j:WARN詳細については、 http://logging.Apache.org/log4j/1.2/faq.html#noconfig を参照してください。

私はグーグルで調べましたが、これをセットアップする簡単な例を見つけることができません。何か案は?

43
Peter Wilkinson

Jatinの答えに加えて:

SpringはJakarta Commons LoggingをロギングAPIとして使用します。 slf4jにログを記録するには、commons-loggingがクラスパスにないことを確認する必要があります。 jcl-over-slf4jは、commons-loggingの代替jarです。

Mavenを使用している場合は、mvn dependency:treeを使用してcommons-loggingが発生する場所を検出し、依存関係の除外を使用してそれを必要とするすべての依存関係から除外できます。ただし、mvn dependency:treeを数回実行する必要がある場合があります。これは、推移的な依存関係の最初の発生のみを表示するためです。

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${org.springframework.version}</version>
  <exclusions>
    <exclusion>
      <artifactId>commons-logging</artifactId>
      <groupId>commons-logging</groupId>
    </exclusion>
  </exclusions>
</dependency>
46
Stijn Van Bael

https://github.com/mbogoevici/spring-samples/tree/master/mvc-basic/trunk にサンプルがあります。ロギングを有効にするには、POMファイルにいくつかの依存関係を含める必要があります。

<!-- Logging -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${org.slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
        <scope>runtime</scope>
    </dependency>
27
Jatin

完全を期すために、logback-classicバリアント:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.6</version>
    <scope>runtime</scope>
</dependency>

ただし、忘れないでくださいdisable commons-logging依存関係これは、受け入れられた(Stijnの)回答のように、Springの依存関係から発生します。

6
Boris Treukhov

classpathJCL APIの実装には、ブロー構成を使用します。

<dependencies>
       <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>3.0.0.RELEASE</version>
          <scope>runtime</scope>
          <exclusions>
             <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
             </exclusion>
          </exclusions>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jcl-over-slf4j</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.14</version>
          <scope>runtime</scope>
       </dependency>
    </dependencies> 

詳細情報の確認 こちら

5
Chandra Sekhar

デフォルトパッケージにlog4jファイルを保持

1
TaherT

私はログバックの方法が好きで、slf4jについても同様の設定を行います:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
    </dependency>

slf4j-log4j12はslf4j-apiとlog4jを自動的に導入するので、それほど多くの依存関係を置く必要はありません

1
Jianyu

lazy-init="false"を追加して、ルートコンテキストでlog4j構成のBeanを積極的にロードします。これで警告メッセージlog4j:WARN No appenders could be found for loggerが解決するはずです

例:

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="false">

より良いアプローチは、web.xmlまたはJVMパラメーターとして構成を使用することです(-Dlog4j.configuration=.../conf/log4j.xmlまたは 'file:'プレフィックスを-Dlog4j.configuration=file:conf/log4j.propertiesとして使用する場合もあります)

0
Nashvi