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