概要
org.slf4j.Loggerは汎用的に使用できるが、業務アプリではログ出力レベルの統一が必要。
そのためビジネスルールで定義したトレースレベルのみ出力する拡張ロガーを作成する。
拡張ロガークラス
org.slf4j.Loggerをラップした独自ロガークラスを作成する。
出力方法はorg.slf4j.Loggerに任せるだけ
Debugレベルは開発時のみ出力する。
SystemLogger.java
/**
*
*/
package jp.co.product.system.common;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ログ出力共通クラス
*
*/
public class SystemLogger {
private Logger logger;
/**
* コンストラクタ
*
* @param cls
* @see org.slf4j.LoggerFactory#getLogger(Class)
*/
public SystemLogger(Class<?> cls) {
logger = LoggerFactory.getLogger(cls);
}
/**
* エラー出力
*
* @param msg ログ出力内容
* @see org.slf4j.Logger#error(String)
*/
public void error(String msg) {
logger.error(msg);
}
/**
* インフォメーション出力
*
* @param msg ログ出力内容
* @see org.slf4j.Logger#error(String)
*/
public void info(String msg) {
logger.info(msg);
}
/**
* デバッグ出力
*
* @param msg ログ出力内容
* @see org.slf4j.Logger#error(String)
*/
public void debug(String msg) {
if (logger.isDebugEnabled())
logger.debug(msg);
}
}
log4j.properties
log4j.propertiesは通常通り。拡張ロガーを実装したクラスから出力できるように設定するだけ。
log4j.properties
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
log4j.logger.org.apache.activemq=ERROR
log4j.logger.org.springframework.batch=DEBUG
log4j.logger.org.springframework.transaction=INFO
log4j.logger.jp.co.product.system.batch=INFO
log4j.logger.test.jdbc=DEBUG
# for debugging datasource initialization
# log4j.category.test.jdbc=DEBUG
呼び出しクラス
拡張ロガークラスのインスタンスを生成しておき、使うだけ。
サンプルソースなのでインスタンスの生成がシングルトンになってない・・・(T&T)
ExampleItemWriter.java
package jp.co.product.system.batch.demo;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.item.ItemWriter;
import org.springframework.stereotype.Component;
import jp.co.product.system.common.SystemLogger;
/**
* Dummy {@link ItemWriter} which only logs data it receives.
*/
@Component("writer")
public class ExampleItemWriter implements ItemWriter<Object> {
//private static final Log log = LogFactory.getLog(SystemLoggerExampleItemWriter.class);
private static final SystemLogger log = new SystemLogger(ExampleItemWriter.class);
/**
* @see ItemWriter#write(java.util.List)
*/
public void write(List<? extends Object> data) throws Exception {
// log.info(data);
log.debug("debug" + data.toString());
log.info("Info" + data.toString());
log.error("error" + data.toString());
}
}
検証環境
SpringBatchにて検証
実行時にslf4jのエラーが出力される。下記サイトを参照してslf4jのモジュール定義が必要
GAE/Jで謎のSLF4JなWARNを退治する
pom.xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>