intra-mart Accel Platform TERASOLUNA Server Framework for Java (5.x) プログラミングガイド 第15版 2019-08-01

ログ

概要

内部統制、セキュリティ確保や保守などの目的からログを出力します。
この項目では TERASOLUNA Server Framework for Java (5.x) for Accel Platform で行うログの実装について記述します。

Logger APIを利用する

Logger(jp.co.intra_mart.common.platform.log.Logger)の使用方法について記述します。

ログレベル

Logger APIでは5つのログレベルが提供されています。
trace(最も軽微)
debug
info
warn
error(最も重大)

Loggerオブジェクトを取得する

public int add(final int value1, final int value2) {
    // ロガーインスタンスを取得
    // ロガー名を指定していないため、クラス名がロガー名となる
    // クラス名:tutorial.controller.AddController
    // ロガー名:tutorial.controller.AddController
    final Logger logger = Logger.getLogger();

    return 0;
}
Logger#getLogger()メソッドを利用してLoggerオブジェクトを取得します。引数に渡す文字列がロガーの名前となります。
引数に何も渡さない場合は、呼び出したクラス名(FQCN)がロガーの名前となります。

ログを出力する

public int add(final int value1, final int value2) {
    // ロガーインスタンスを取得
    // ロガー名を指定していないため、クラス名がロガー名となる
    // クラス名:tutorial.controller.AddController
    // ロガー名:tutorial.controller.AddController
    final Logger logger = Logger.getLogger();

    logger.debug("arguments=[{}, {}]", value1, value2);
    final int result = value1 + value2;
    logger.trace("result={}", result);

    return result;
}
Loggerオブジェクトを利用してログの出力を行います。
上記の関数では、引数に渡された値がdebugレベルで、計算結果がtraceレベルで出力しています。
ログレベルdebugでadd(1, 2)を実行した場合は以下のような出力になります。
[DEBUG] t.c.AddController - arguments=[1, 2]
ログレベルtraceでadd(1, 2)を実行した場合は以下のような出力になります。
[DEBUG] t.c.AddController - arguments=[1, 2]
[TRACE] t.c.AddController - result=3

MDC APIを利用する

MDC(jp.co.intra_mart.common.platform.log.MDC)の使用方法について記述します。

MDC

Mapped Diagnostic Context(マップ化された診断コンテキスト)を利用することにより、ログ設定ファイルのレイアウト設定で独自に定義したkeyで保存した情報をログに出力することが可能となります。
MDC APIを利用することにより、独自に定義したkeyへの情報の書き込みが可能となります。

MDCを利用したログを出力する

// MDCのキーを定義
private static final String MKC_FUNC_KEY = "application.func";

public int add(final int value1, final int value2) {
    // ロガーインスタンスを取得
    // ロガー名を指定していないため、クラス名がロガー名となる
    // クラス名:tutorial.controller.AddController
    // ロガー名:tutorial.controller.AddController
    final Logger logger = Logger.getLogger();

    // MDCに値を設定
    MDC.put(MKC_FUNC_KEY, "add");

    logger.debug("arguments=[{}, {}]", value1, value2);
    final int result = value1 + value2;
    logger.trace("result={}", result);

    // MDCの値を初期化
    MDC.remove(MKC_FUNC_KEY);

    return result;
}
実行中の関数名をMDCに設定しています。
MDC#put(key, value)メソッドで、MDCのキー “application.func” に実行中の関数名 “add” を設定しています。
MDCに保存した内容は、明示的に初期化が行われない限り値が初期化されることがありません。
そのため、目的のログ出力処理が完了後にMDC#remove(key)メソッドで、MDCのキー “application.func” の値を初期化しています。
出力例
%CONTEXT_PATH%/WEB-INF/conf/log/im_logger.xmlの<configuration>/<appender name=”STDOUT”>/<encoder>/<pattern>の内容を以下に変更し、アプリケーションサーバを再起動します。
[%level] %logger{10} - %X{application.func} %msg%n
ログレベルtraceでadd(1, 2)を実行した時のログ出力
[DEBUG] t.c.AddController - add arguments=[1, 2]
[TRACE] t.c.AddController - add result=3

TERASOLUNA Server Framework for Java (5.x) for Accel Platform のログ出力設定について

WEB-INF/conf/log/im_logger_tgfw.xml にログ出力の設定を記載しています。
標準で、 WEB-INF/log/platform/im_tgfw.log ファイルにログを出力します。
運用環境に合わせて設定を変更してください。
標準の設定は以下の通りです。
ロガー名 ログレベル
jp.co.intra_mart.framework.extension.spring warn
jp.co.intra_mart.system.router.spring warn
org.springframework warn
org.springframework.web.servlet info
org.terasoluna.gfw info
org.terasoluna.gfw.common.exception.ExceptionLogger info
org.terasoluna.gfw.common.exception.ExceptionLogger.Monitoring none

TERASOLUNA Server Framework for Java (5.x) の TraceLoggingInterceptor を利用する。

TraceLoggingInterceptorは、リクエストURLにマッピングされたメソッドの処理時間を出力する機能です。
TERASOLUNA Server Framework for Java (5.x) for Accel Platform では、 applicationContext-im_tgfw_web.xml と im_logger_tgfw.xml に設定をすることによって、この機能を利用することができます。
TraceLoggingInterceptor の詳細については、 TERASOLUNA Server Framework for Java (5.x) Development Guideline の TraceLoggingInterceptorの項 を参考にしてください。
applicationContext-im_tgfw_web.xml の設定
mvc:interceptorsにTraceLoggingInterceptorの設定を追加します。
    <!-- MVC interceptors -->
    <mvc:interceptors>

        <!-- 中略 -->

        <!-- TraceLoggingInterceptorを追加する。 -->
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="org.terasoluna.gfw.web.logging.TraceLoggingInterceptor">
                <property name="warnHandlingNanos" value="1000000000" />
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>

コラム

mvc:mapping の path 属性は、トレースログを出力する対象の Controller クラスのパッケージに絞って設定してください。
im_logger_tgfw.xml の設定
org.terasoluna.gfw.web.logging.TraceLoggingInterceptor のログ出力設定を追加します。
    <logger name="org.terasoluna.gfw.web.logging.TraceLoggingInterceptor" additivity="false">
        <level value="trace" />
        <appender-ref ref="IM_TGFW" />
    </logger>