46

ログインしたい 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を参照してください。

私はグーグルで検索しましたが、これを設定する簡単な例が見つかりません。何か案は?

4

7 に答える 7

47

ジャティンの答えに加えて:

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

Mavenを使用している場合は、commons-loggingがどこで使用されているかを検出し、mvn dependency:tree依存関係の除外を使用して、それを必要とするすべての依存関係から除外できます。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>
于 2010-08-16T09:18:33.307 に答える
27

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>
于 2010-08-02T12:04:38.887 に答える
6

完全を期すために、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>

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

于 2012-11-17T18:12:06.087 に答える
5

での実装にはブロー コンフィギュレーションを使用しJCL APIますclasspath

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

詳しくはこちら

于 2012-01-29T02:01:35.240 に答える
1

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

于 2010-08-02T12:21:40.177 に答える
1

私は logback の方法が好きで、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 を自動的に導入するため、それほど多くの依存関係を配置する必要はありません

于 2012-12-31T03:22:28.630 に答える
0

追加lazy-init="false"するだけで、ルート コンテキストで log4j 構成の Bean を積極的にロードできます。それはWARNメッセージを解決するはずです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) 持つことです。

于 2015-10-09T14:34:49.840 に答える