Open6

全てのログをslf4jに寄せていく

todeskingtodesking
  • slf4jを使ってるライブラリ
  • Commons Loggingを使ってるライブラリ
  • java.util.Loggingを使ってるライブラリ
  • log4j 1.xを直接使ってるライブラリ
  • log4j 2.xを直接使ってるライブラリ

があり、全てのログをslf4j + logback-classicで管理したいときの手法。

todeskingtodesking

Commons Logging を slf4j に接続する

jcl-over-slf4j(doc, maven)というものがある。

Commons Loggingと同じAPIを提供して、裏ではslf4jにログを流してくれる。

使用の際はCommons Loggingを依存から除外しておく必要がある。
SBTなら

excludeDependencies ++= Seq(
  ExclusionRule("commons-logging", "commons-logging")
)

など。

todeskingtodesking

Log4j 1.x をslf4jに接続する

log4j-1.2-api(doc, maven)というものがあり、log4j1のAPIでlog4j2にログを出力してくれる。

あとは後述のlog4j-to-slf4jを使ってslf4jにログを流す。

使用の際はlog4j1のjarを依存から除外する必要がある:

excludeDependencies += ExclusionRule("log4j", "log4j")
todeskingtodesking

Log4j 2.x をslf4jに接続する

log4jのjarを置き換えるlog4j-over-slf4jというものがある( doc, maven )が、log4j-1.2-apiと相性が悪いので log4j-to-slf4j(doc, maven )のほうが無難。

todeskingtodesking

java.util.loggingをslf4jに接続する

jul-to-slf4j(doc, maven)というものがあり、slf4j用のjulハンドラを設定してくれる。

ドキュメントによれば、 logging.properties でハンドラを設定する方法があるらしいが、なぜか動かなかった。

logging.properties
 // register SLF4JBridgeHandler as handler for the j.u.l. root logger
 handlers = org.slf4j.bridge.SLF4JBridgeHandler

アプリケーションの先頭でハンドラを設定するメソッドを呼べば正常に動く。

  def main(args: Array[String]): Unit = {
    org.slf4j.bridge.SLF4JBridgeHandler.removeHandlersForRootLogger()
    org.slf4j.bridge.SLF4JBridgeHandler.install()
    // ...
  }