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だけレベル変えるのが楽でした。