普通にロガーを作成し、そのままログを出力すると、 debugレベルからerrorレベルまで、すべてのログをコンソールに出力する設定になっています。
このふるまいを変更するためには、ロガーの設定を変更します。 ロガーの設定の変更の方法には、XMLファイルに設定を記述し、それを読み込む方法と、 直接Javaプログラム上で設定を変更するためのコードを記述する方法とがあります。
このページでは、設定を変更する例として、ファイルにログを出力する方法を記載します。
次に示すコードでは、コンソールとJava実行ディレクトリにlogbacktest.logというファイルそれぞれにログを出力します。
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.FileAppender;
public class FileAppendTest {
public static void main(String[] args) {
Logger logger = (Logger)
LoggerFactory.getLogger(LoggerContext.ROOT_NAME);
// コメントアウトすると、
// コンソールには出力されなくなる。
//logger.detachAndStopAllAppenders();
LoggerContext context = logger.getLoggerContext();
PatternLayout layout = new PatternLayout();
layout.setContext(context);
layout.setPattern("%-5level [%thread]: %msg %n");
layout.start();
FileAppender<LoggingEvent> appender =
new FileAppender<LoggingEvent>();
appender.setContext(context);
appender.setFile("logbacktest.log");
appender.setEncoding("utf-8");
appender.setImmediateFlush(true);
appender.setLayout(layout);
appender.start();
logger.addAppender(appender);
logger.info("きままにインデックス");
}
}
手順は、大きく分けて3つ必要です。
レイアウトは、何でもいいのですが、logbackの作者がサンプルでよく使うPatternLayoutを使いました。 レイアウトは、setPattern(String)メソッドでパターンを指定しますが、 その前にsetContext(LoggerContext)メソッドでコンテキストを設定しなくてはなりません。 パターンを指定したら、start()メソッドを呼び出してスタートしておきます。
そしてファイルに出力するためのファイルアペンダーを作成し、 まずはsetContext(LoggerContext)メソッドでコンテキストを設定します。 その後に諸々の設定を行います。
出力先のファイルはsetFile(String)メソッドでファイルのパスを指定します。 出力の文字符号化方式はsetEncoding(String)メソッドで文字符号化の名前を指定します。
setImmediateFlush(boolean)メソッドは、逐次書き込みをするかどうかを指定します。 trueを指定すると逐次書き込み、falseを指定するか、このメソッドを呼び出さなければ逐次書き込みをしません。 しかし、falseを指定してしまうと、書き込まれないままアプリケーションが終了してしまい、ログが残らないといった問題が発生することがありますので、 速度がやたら必要なアプリケーション以外ではtrueを指定するようにします。
そして出力するフォーマットは、前もって作成しておいたPatternLayoutのインスタンスを指定します。 すべての設定が終了したらstart()メソッドでスタートします。
FileAppenderのインスタンスの設定が終了してスタートしたら、それをロガーのaddAppender(Appender<LoggingEvent>)に指定します。 この直後から、指定されたロガーと、名前的に子供のロガーへのログ書き込み要求が発生したときに、 ファイルにも書き込まれるようになります。
設定では、いろいろとメソッドを呼び出さなければならず、 1つや2つの設定を忘れてしまうこともしばしばあります。 そして原因を突き止めるのに時間が掛かることがあるので、 きちんとファイルにログが表示されない等の異常があった場合、 抜けている手順がないか確認していみましょう。
執筆中です。。