[Talend] Logger のルーチン化とログローテーション

2015.10.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回は Talend ジョブで Log4j によるロギングを行う方法を紹介しました。

今回は、ジョブの中で使いやすいよう Logger をルーチン化するとともにログローテーションが行われるようにしてみます。

Logger のルーチン化

Talend では、よく利用する処理などを「ルーチン」という Java のクラスとして定義しておくことができます。

WS000000

ロギング用のユーティリティとして「TalendLogger」クラスを用意します。

TalendLogger

package routines;

import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

public class TalendLogger {

    private static final Map<String, Logger> loggerMap = new HashMap<>();

    public static void debug(String name, String message) {
        getLogger(name).debug(message);
    }

    public static void error(String name, String message) {
        getLogger(name).error(message);
    }

    public static void fatal(String name, String message) {
        getLogger(name).fatal(message);
    }

    public static void info(String name, String message) {
        getLogger(name).info(message);
    }

    public static void trace(String name, String message) {
        getLogger(name).trace(message);
    }

    public static void warn(String name, String message) {
        getLogger(name).warn(message);
    }

    private static Logger getLogger(String name) {
        if (!loggerMap.containsKey(name)) {
            loggerMap.put(name, Logger.getLogger(name));
        }
        return loggerMap.get(name);
    }

    private TalendLogger() {
    }

}

Talend ジョブ内に Logger インスタンスを保持して利用するのは少々手間がかかるので、今回はルーチン内に Logger インスタンスをキャッシュするようにしています。

適当なジョブを作成し tJava コンポーネントでメッセージを出力してみます。

WS000001

各メソッドの第一引数にはジョブ名称を、第二引数にはメッセージを指定します。

tJava_1

TalendLogger.trace(jobName, "Trace");
TalendLogger.debug(jobName, "Debug");
TalendLogger.info(jobName, "Info");
TalendLogger.warn(jobName, "Warn");
TalendLogger.error(jobName, "Error");
TalendLogger.fatal(jobName, "Fatal");

全てのログを出力するため、「プロジェクトの設定」内「Log4j template」のルートログレベルを ALL にします。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >

    <!--  CONSOLE appender  -->
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern"
                  value="[%-5p]: %c - %m%n" />
        </layout>
    </appender>

    <!-- Spring Logger -->
    <logger name="log4j.logger.org.springframework">
        <level value="WARN" />
        <appender-ref ref="CONSOLE"/>
    </logger>

    <!-- throwableRenderer <throwableRenderer class="org.apache.log4j.EnhancedThrowableRenderer"/>-->

    <!-- logstash appender -->
      <!-- <appender name="LOGSTASH" class="org.apache.log4j.net.SocketAppender">
          <param name="RemoteHost" value="localhost"/>
          <param name="Port" value="8052"/>
    </appender> -->

    <!-- Root Logger -->
    <root>
        <priority value ="all"/>
        <appender-ref ref="CONSOLE"/>
        <!-- <appender-ref ref="LOGSTASH"/> -->
    </root>
</log4j:configuration>

実行結果は下図のようになります。

WS000002

コンソールにログが出力されました。

ログローテーション

ログローテーションには RollingFileAppender を使いますが、Talend 管理下のライブラリには含まれていないので Jar ファイルをロードする必要があります。

幸いルーチンには「ルーチンライブラリ」として Jar ファイルを関連付けることが出来るのでそれを利用します。

1. ライブラリのダウンロード

Jar ファイルをダウンロードします。

2. ルーチンライブラリへの登録

ルーチン「TalendLogger」へ Jar ファイルを追加します。前段で TalendLogger を作成したのは、依存する Jar ファイルをルーチンライブラリとして関連付けるためでもあります。

TalendLogger を右クリックしてコンテキストメニューを開き「ルーチンライブラリの編集」を選択します。

WS000003

「New...」ボタンを押下します。

WS000004

「ライブラリファイルをブラウズ」を選択し、「Browse...」ボタンから対象の Jar ファイルを選択します。

WS000005

一覧に追加されたら「Finish」ボタンを押下します。

WS000006

これによりジョブ内でルーチン「TalendLogger」を使用してロギングする限り apache-log4j-extras-1.2.17.jar がロードされるようになるので RollingFileAppender が利用できます。

3. Log4j template の設定

Log4j template に RollingFileAppender の設定を記述します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >

    <!--  CONSOLE appender  -->
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern"
                  value="[%-5p]: %c - %m%n" />
        </layout>
    </appender>

    <!--  FILE appender  -->
    <appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">
        <param name = "Append" value="true" />
        <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
            <param name="FileNamePattern" value="C:/path/to/logs/%d{yyyy-MM-dd-HH-mm}.log" />
        </rollingPolicy>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %c -%-4r [%t] %-5p %x - %m%n" />
        </layout>
    </appender>

    <!-- Spring Logger -->
    <logger name="log4j.logger.org.springframework">
        <level value="WARN" />
        <appender-ref ref="CONSOLE"/>
    </logger>

    <!-- Root Logger -->
    <root>
        <priority value ="all"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>

</log4j:configuration>

FileNamePattern のパス(/path/to/logs)には任意のディレクトリを指定します。

4. ジョブの実行

前段で作成したジョブを実行すると指定ディレクトリにログファイルが出力されます。

C:PATHTOLOGS

2015-10-15-15-11.log

FileNamePattern のログ名に年月日時分(yyyy-MM-dd-HH-mm)までの指定があるので、何度かジョブの実行を繰り返して時刻が変わるとログローテーションすることが確認できます。

C:PATHTOLOGS

2015-10-15-15-11.log
2015-10-15-15-12.log
2015-10-15-15-13.log

まとめ

Talend には外部 Jar ファイルを利用する方法がいくつか用意されていますが、ルーチンライブラリは最も利用しやすいように感じました。
外部 Jar ファイルを用いる処理などは、ルーチンを作成しそれに Jar ファイルを関連付けユーティリティクラスのような形で用意しておくと便利かと思います。