Java
logger
log4j
spring-boot
slf4j

Java でロガーを SLF4J に統一する冴えたやり方

こんな人向けの記事です

  • SLF4J に統一したはずなのに、たまにコンソールに謎ログが出てる
  • org.apache.juli.logging.DirectJDKLog なる謎のクラスのログをよく見る。。。
  • gradle/maven で exclude すると除外できるのは知ってるけど、新規ライブラリを追加したタイミングで log4j の実装が混入してログがでなくなったりしている
  • まとめて log4j や commons-logging を取り除きたい

Tips

以下の構文で一括 除外 ができる

configurations.all {
    exclude
}

TL;DR

そのため、全てのプロジェクトに 各種ログライブラリ > SLF4J で出力、に必要なモジュールを入れて、各種ログライブラリの実装のほうを Exclude してやればよい。

build.gradle
dependencies {
    // Used compile/coding time.
    compile 'org.slf4j:slf4j-api:1.7.25'

    // Used Runtime
    runtime 'ch.qos.logback:logback-classic:1.2.3' // The log implementation.
    runtime 'org.slf4j:jcl-over-slf4j:1.7.25' // Commons-Logging > SLF4J
    runtime 'org.slf4j:jul-to-slf4j:1.7.25' // Java Util Logging > SLF4J
    runtime 'org.apache.logging.log4j:log4j-to-slf4j:2.11.0' // Log4j 1&2 > SLF4J
}

configurations.all {
    exclude group: 'log4j' // = Log4j implementation.
    exclude module: 'log4j-slf4j-impl' // = SLF4J > Log4J Implementation. (Apache Side)
    exclude module: 'slf4j-log4j12' // = SLF4J > Log4J Implementation. (SLF4J Side)
    exclude module: 'log4j-over-slf4j' // = Old Log4j 1&2 > SLF4J
    exclude module: 'slf4j-jdk14' // = SLF4J > JDK14 Binding
    exclude module: 'commons-logging' // Because bridged by jcl-over-slf4j
    exclude module: 'commons-logging-api' // Replaced by jcl-over-slf4j
}

(明日以降見直す)