マイナー・マイナー

隠れた名作の発掘が生きがい。

【log4j2】ThreadContextを利用してすべてのログに追加情報を出力する


スポンサードリンク

log4j2でセッションIDやユーザID等、ログに毎回書き出したいような情報を付加する場合はThreadContextを利用するのが良さそうです。Thread ContextのStackとMapの機能を利用して、追加情報をログに出力するサンプルを書きました。

Thread Context Stack

スタックのように情報を付加する方法です。まず、log42jの設定ファイルのPatternLayoutに%xを書きます。コードでは、情報を不可する場合はThreadContext.push、情報を削除する場合はThreadContext.popを記述します。

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %x%msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>


App.java

package com.jp.test.MyProject;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class App
{
    private static Logger logger = LogManager.getLogger();
   
    public static void main( String[] args )
    {
        logger.debug("A1");
        logger.debug("A2");
        ThreadContext.push("Stack-1");
        logger.debug("B1");
        logger.debug("B2");
        ThreadContext.push("Stack-2");
        logger.debug("C1");
        logger.debug("C2");
        ThreadContext.pop();
        logger.debug("D1");
        logger.debug("D2");
        ThreadContext.pop();
        logger.debug("E1");
        logger.debug("E2");
    }
}


実行結果

18:33:13.818 [main] DEBUG com.jp.test.MyProject.App - []A1
18:33:13.819 [main] DEBUG com.jp.test.MyProject.App - []A2
18:33:13.819 [main] DEBUG com.jp.test.MyProject.App - [Stack-1]B1
18:33:13.819 [main] DEBUG com.jp.test.MyProject.App - [Stack-1]B2
18:33:13.819 [main] DEBUG com.jp.test.MyProject.App - [Stack-1, Stack-2]C1
18:33:13.819 [main] DEBUG com.jp.test.MyProject.App - [Stack-1, Stack-2]C2
18:33:13.820 [main] DEBUG com.jp.test.MyProject.App - [Stack-1]D1
18:33:13.820 [main] DEBUG com.jp.test.MyProject.App - [Stack-1]D2
18:33:13.820 [main] DEBUG com.jp.test.MyProject.App - []E1
18:33:13.820 [main] DEBUG com.jp.test.MyProject.App - []E2

Thread Context Map

key-valueで指定した属性に情報を追加する方法です。まず、設定ファイルのPatternLayoutに%X{key}で、出力したい情報のkeyを設定します。コードではThreadContext.put(key, value)で情報を付加します。情報をすべて削除する場合はThreadContext.clearMap()を呼び出します。

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - id=%X{id}, name=%X{name} :%msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>


App.java

package com.jp.test.MyProject;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class App
{
    private static Logger logger = LogManager.getLogger();
   
    public static void main( String[] args )
    {
        logger.debug("A1");
        logger.debug("A2");
        ThreadContext.put("id", "0001");
        logger.debug("B1");
        logger.debug("B2");
        ThreadContext.put("name", "hoge");
        logger.debug("C1");
        logger.debug("C2");
        ThreadContext.put("id", "0002");
        logger.debug("D1");
        logger.debug("D2");
        ThreadContext.clearMap();
        logger.debug("E1");
        logger.debug("E2");
    }
}


実行結果

18:43:20.747 [main] DEBUG com.jp.test.MyProject.App - id=, name= :A1
18:43:20.747 [main] DEBUG com.jp.test.MyProject.App - id=, name= :A2
18:43:20.747 [main] DEBUG com.jp.test.MyProject.App - id=0001, name= :B1
18:43:20.748 [main] DEBUG com.jp.test.MyProject.App - id=0001, name= :B2
18:43:20.748 [main] DEBUG com.jp.test.MyProject.App - id=0001, name=hoge :C1
18:43:20.748 [main] DEBUG com.jp.test.MyProject.App - id=0001, name=hoge :C2
18:43:20.748 [main] DEBUG com.jp.test.MyProject.App - id=0002, name=hoge :D1
18:43:20.748 [main] DEBUG com.jp.test.MyProject.App - id=0002, name=hoge :D2
18:43:20.748 [main] DEBUG com.jp.test.MyProject.App - id=, name= :E1
18:43:20.748 [main] DEBUG com.jp.test.MyProject.App - id=, name= :E2


関連:
minor.hatenablog.com