Search on the blog

2016年11月3日木曜日

SLF4Jでロギング

SLF4Jとは?
Simple Logging Facade for Java。ロギングフレームワークのFacade的なやつ。
SLF4Jを使うことで、特定のロギングフレームワークの実装に依存することなく、ロギング処理が書ける。

準備
gradleでプロジェクトを作成すると、
gradle init --type java-library

デフォルトでslf4j-apiがdependenciesに入ってた。
dependencies {
    compile 'org.slf4j:slf4j-api:1.7.13'
    testCompile 'junit:junit:4.12'
}

使ってみる
package com.kenjih.logging;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Sample {

    public void run() {
        Logger logger = LoggerFactory.getLogger(Sample.class);
        logger.info("Hello, world!");
    }

    public static void main(String[] args) {
        new Sample().run();
    }

}

このままで実行するとエラーになる。
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

ここで注目すべきは、コード自体はコンパイルできること。
エラー内容は実行するときにロガー実装が見つかりませんでした的な内容。つまり特定のロガー実装に依存することなくロギングコードが書けて、このソースの使用者が使用するロガーを決めることができるということ。これはライブラリを書くときに非常に便利。なぜなら特定のロガー実装をエンドユーザーに強制する必要がなくなるから。

ということで以下ロガー実装との組み合わせを試していく。

log4j2を使う
ロガー実装としてlog4j2を使うことにする。

build.gradleに以下のdependencyを追記。
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.7'  
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.7'
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.7'

クラスパスに以下のファイルをlog4j2.xmlという名前で置く。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss} %-5level - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

実行。
2016/11/03 19:40:51 INFO  - Hello, world!

log4jを使う
log4j 1系でやってみる。

依存ライブラリは以下のものを使う。
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.13'
compile group: 'log4j', name: 'log4j', version: '1.2.17'

設定ファイルは、log4j.xmlという名前でクラスパスに置く。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

  <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>
  <root>
    <appender-ref ref="stdout"/>
  </root>
</log4j:configuration>

実行。
Hello, world!

0 件のコメント:

コメントを投稿