2018年11月06日

Java - Apache Log4jを使う

pom.xml ライブラリへ追加
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jp.example</groupId>
<artifactId>MyMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
MyLogger.java ログ出力専用のクラスを作成。このクラスを使ってログ出力を行う。
package jp.co.example;

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.xml.DOMConfigurator;

public class MyLogger {

/** ロガー **/
private Logger logger;

/** プロパティ **/
private Properties p = new Properties();

/**
* コンストラクタ
* @param outputFile log出力先パス
* @throws Exception
*/
public MyLogger(String outputFile) throws Exception {

try {
// log4j設定ファイル指定
logger = Logger.getLogger(MyLogger.class);
DOMConfigurator.configure("config/log4j.xml");

// ログ出力
RollingFileAppender appender = (RollingFileAppender) logger.getParent().getAppender("mylog");
appender.setFile(outputFile);
appender.activateOptions();

// プロパティ読み込み
final String messageFile = "config/message.properties";
InputStream messageInputStream = new FileInputStream(messageFile);
p.load(messageInputStream);
messageInputStream.close();

} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 通常ログ
* @param msgId メッセージID
* @param params パラメータ
*/
public void outLog(String msgId, Object... params) {
outputLog(msgId, Level.INFO, null, params);
}

/**
* エラーログ
* @param msgId メッセージID
* @param cause スローされた例外
* @param params パラメータ
*/
public void outLog(String msgId, Throwable cause, Object... params) {
outputLog(msgId, Level.ERROR, cause, params);
}

/**
* ログをファイルへ出力
*/
private void outputLog(String msgId, Level level, Throwable cause, Object... params) {

String fmt = MessageFormat.format("{0} : {1}", msgId, p.getProperty(msgId));
String message = MessageFormat.format(fmt, (Object[]) params);
logger.log(MyLogger.class.getName(), level, message, cause);
}
}
config/log4j.xml (log4j設定ファイル)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

<!-- ログファイル出力 -->
<appender name="mylog" class="org.apache.log4j.RollingFileAppender">
<param name="MaxBackupIndex" value="10" />
<param name="MaxFileSize" value="10MB" />
<param name="File" value="./work/mylog.log" />
<param name="Append" value="true" />
<param name="Encoding" value="Shift_JIS" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] [%-5p] [%t] [%l] - %m%n" />
</layout>
</appender>

<!-- 画面出力 -->
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] [%-5p] [%t] [%l] - %m%n" />
</layout>
</appender>

<!-- ログレベル・出力先 -->
<root>
<level value="debug"/>
<appender-ref ref="mylog"/>
<appender-ref ref="stdout"/>
</root>
</log4j:configuration>
config/message.properties (プロパティエディタで編集)
MSGID-001 = メッセージID1
MSGID-002 = メッセージID2 {0}
MSGID-901 = エラーメッセージID901
Main.java 使用例、呼び出し元のクラス。
ポイント
  • IDを指定するだけで定型文をログ出力。
  • 定型文は外部ファイルで管理。
  • エラー時はStackTraceをそのまま出力。
package jp.co.example;

public class Main {

// ロガー
private static MyLogger myLogger;

public static void main(String... args) {
try {
// ロガー初期化
myLogger = new MyLogger("./mylogfile.log");

// ログ出力
myLogger.outLog("MSGID-001");
myLogger.outLog("MSGID-002", "引数渡せます");

// エラー誘発
System.out.println(0 / 0);

} catch (Exception e) {
// エラーログ出力
myLogger.outLog("MSGID-901", e);
}
}
}
タグ:JAVA Eclipse
posted by Hiro at 22:43| Comment(0) | プログラム