1. ホーム
  2. java

[解決済み] Spring + Logback(slf4j) jcl-over-slf4jを使用しないロギング

2022-02-07 21:11:39

質問

Spring MVC (version 4.1.0) のプロジェクトに Logback と Slf4j を追加する場合、maven の依存関係を以下のように追加することができます。

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
                <version>1.7.21</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.21</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.1.7</version>
                <scope>runtime</scope>
            </dependency>

で、commons-logging 依存関係を除外すると、ログファイルにはアプリケーションログに加えて、いくつかの春のイベントの INFO レベルが出力されるようになりました。

[RMI TCP Connection(4)-127.0.0.1][org.springframework.web.context.ContextLoader] - Root WebApplicationContext: initialization started

jcl-over-slf4jを使わずに、pom.xmlでcommons-loggingを除外せずに依存関係を追加すると、アプリケーションログだけが取得されます。

これは私のlogback.xmlです。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="LOG_HOME" value="logs" />
    <property name="APP_NAME" value="App" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">        
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%-5level %d{yyyy-MM-dd HH:mm:ss.SSS} %thread %logger{50} - %msg%n</pattern>            
        </encoder>
    </appender>

    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>

        <encoder>
            <charset>UTF-8</charset>
            <pattern>%-5level %d{yyyy-MM-dd HH:mm:ss.SSS} %thread %logger{50} - %msg%n</pattern>                
        </encoder>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>  

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

    <logger name="org.springframework" level="INFO" appender-ref="FILE"/>
</configuration>

私が理解するところでは、JCLブリッジを使用しない場合、logbackはJCLスプリングインナーログをキャッチしたり、変換したりすることができないため、この現象が発生します。もし私が間違っているならば、訂正してください。

JCL-bridgeを使わずに、logback.xmlを設定して、標準的なspringログイベントを取得することはできますか?

どのように解決するのですか?

チェックする ドキュメント というのも、多くの例題があり、良い情報源だからです。 質問に戻ります。 SpringとJCL。

<ブロッククオート

Springでロギングに必須な依存関係は、Jakarta Commons Logging API (JCL)です。JCL に対してコンパイルし、JCL Log オブジェクトは、Spring Frameworkを拡張するクラスで可視化されます。これは Springのすべてのバージョンで同じロギングを使用することは、ユーザーにとって重要です。 ライブラリ:後方互換性があるため、移行は簡単です。 Springを拡張したアプリケーションであっても、この方法は維持されます。 Springのモジュールの1つを明示的に commons-logging (JCLの標準的な実装)を使用し、その後 他のすべてのモジュールは、コンパイル時にそれに依存します。もし、あなたが 例えば、Mavenで、どこで commons-loggingはSpringから、具体的には という中心的なモジュールです。

ログバックの設定、ここがポイントです。

<ブロッククオート

SLF4Jのユーザーの間では、より一般的な選択で、より少ないステップの砂を使用します。 は、Logbackに直接バインドすることで、より少ない依存性を生成することができます。これは は、余分なバインディングのステップを削除します。 ログバックはSLF4Jを実装している を直接使用するため、4つのライブラリではなく、2つのライブラリに依存する必要があるだけです。 (jcl-over-slf4jとlogback) . その場合、次のことも必要かもしれません。 slf4j-apiの依存関係は、他の外部依存関係から除外されます。 なぜなら、そのAPIは1つのバージョンしか必要ないからです。 のクラスパスが必要です。