21
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

slf4j-simpleで、ログレベルをDEBUGやTRACEにする方法

Last updated at Posted at 2014-12-03

slf4jの出力をコンソールにサクッと出したい!というときに、slf4j-simpleを使えばいいんじゃね?と思って使うと、ログレベルがINFOレベル以上でないとコンソールに出力されなくて愕然としたことのある諸兄も多いと思います。
そこで、slf4j-smpleでもログレベルを変更する方法をご紹介!
方法は簡単。システムプロパティをいじるだけでOKです!

サンプルコード

一括で変更

Sample.java
System.setProperty("org.slf4j.simpleLogger.defaultLogLevel","DEBUG")
// ただし、この設定はstatic constructorで読み込まれるので、なるべくなら起動オプションに渡したほうが無難です。
// java -Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG Main

一部のクラスだけ変更

Sample.java
System.setProperty("org.slf4j.simpleLogger.log.MyClass","DEBUG")
Logger logger = LoggerFactory.getLogger("com.hoge.MyClass")

システムプロパティに"org.slf4j.simpleLogger.log." + クラス名のKeyでログレベルを設定してあげると個別にもログレベルを変更可能です。

また、sbtのtestだけで有効にしたい場合は、

build.sbt
fork in Test := true

javaOptions in Test += "-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG"

を設定しておくとOKです。

さらに

実行時パラメータで渡したり、初期化のタイミングを考慮したり面倒くさい!という諸兄には、リフレクションを使った方法をご紹介

ModifyLogLevel.scala

import org.slf4j.impl._
import org.slf4j._
import org.slf4j.spi.LocationAwareLogger

val logger : Logger = LoggerFactory.getLogger("ClassName")
val logLevel = LocationAwareLogger.DEBUG_INT // DEBUGレベル
logger match{
  case l : org.slf4j.impl.SimpleLogger => {
    val field = l.getClass.getDeclaredField("currentLogLevel")
    field.setAccessible(true) //protectedなので、無理やりアクセスするためにAccessibilityを変える
    field.set(l,logLevel)
  }
  case _ => // Not slf4j-simple logger
}

正直ユニットテストに使う分には、これで対象のLoggerだけレベル変えるのが楽でした。

21
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?