Class InheritableMDCAdapter

java.lang.Object
com.streamconverter.logging.InheritableMDCAdapter
All Implemented Interfaces:
org.slf4j.spi.MDCAdapter

public class InheritableMDCAdapter extends Object implements org.slf4j.spi.MDCAdapter
MDCAdapter implementation that propagates MDC context to child threads via InheritableThreadLocal.

The standard LogbackMDCAdapter uses plain ThreadLocal, which does not propagate to child threads. This implementation uses InheritableThreadLocal so that virtual threads (and platform threads) spawned from a parent automatically inherit a copy of the parent's MDC context map.

Use MDCInitializer.initialize() at application startup (before the first log call) to install this adapter.

Thread safety: Each thread holds its own independent copy of the context map via InheritableThreadLocal. Child threads receive a shallow copy (snapshot) of the parent's map at creation time; subsequent changes in the parent are not reflected in already-running children, and vice versa. Individual per-thread maps are not synchronized, which is safe as long as each map is accessed only by its owning thread — which is the normal MDC usage pattern.

  • Constructor Details

  • Method Details

    • put

      public void put(String key, String val)
      現在のスレッドのMDCコンテキストにキーと値を設定する。

      このメソッド呼び出し後に起動された子スレッドは、このエントリを自動継承する (InheritableThreadLocal による)。ただし、既に起動済みの子スレッドには反映されない。

      Specified by:
      put in interface org.slf4j.spi.MDCAdapter
      Parameters:
      key - MDCキー名。nullの場合は IllegalArgumentException をスロー
      val - 設定する値
      Throws:
      IllegalArgumentException - keyがnullの場合
    • get

      public String get(String key)
      現在のスレッドのMDCコンテキストから指定キーの値を取得する。
      Specified by:
      get in interface org.slf4j.spi.MDCAdapter
      Parameters:
      key - MDCキー名
      Returns:
      設定されている値。キーが存在しないかkeyがnullの場合はnull
    • remove

      public void remove(String key)
      現在のスレッドのMDCコンテキストから指定キーを削除する。

      削除後にコンテキストが空になった場合は InheritableThreadLocal 自体を解放する。 Dequeスタック(pushByKey(java.lang.String, java.lang.String)/popByKey(java.lang.String))には影響しない。 Dequeを含む全エントリのクリアには clear() を使用すること。

      Specified by:
      remove in interface org.slf4j.spi.MDCAdapter
      Parameters:
      key - 削除するMDCキー名
    • clear

      public void clear()
      現在のスレッドのMDCコンテキスト(マップおよびDeque)をすべてクリアする。

      InheritableThreadLocal のエントリを解放するため、このメソッド呼び出し後に 生成される子スレッドにはコンテキストが継承されない。 なお、既に起動済みの子スレッドが保持するコピーには影響しない。

      Specified by:
      clear in interface org.slf4j.spi.MDCAdapter
    • getCopyOfContextMap

      現在のスレッドのMDCコンテキストのコピーを返す。

      返されたマップはスナップショットであり、以降の変更は反映されない。

      Specified by:
      getCopyOfContextMap in interface org.slf4j.spi.MDCAdapter
      Returns:
      MDCコンテキストのコピー。コンテキストが未設定の場合はnull
    • setContextMap

      public void setContextMap(Map<String,String> contextMap)
      現在のスレッドのMDCコンテキストを指定されたマップで置き換える。

      nullを渡すとコンテキストをクリアする。子スレッドへの継承も更新後の内容になる。

      Specified by:
      setContextMap in interface org.slf4j.spi.MDCAdapter
      Parameters:
      contextMap - 新しいMDCコンテキスト。nullの場合はクリア
    • pushByKey

      public void pushByKey(String key, String value)
      指定キーのDequeスタックに値をプッシュする。

      keyがnullの場合は何もしない。

      Specified by:
      pushByKey in interface org.slf4j.spi.MDCAdapter
      Parameters:
      key - Dequeのキー名
      value - プッシュする値
    • popByKey

      public String popByKey(String key)
      指定キーのDequeスタックから先頭の値をポップして返す。

      keyがnullまたはDequeが存在しない場合はnullを返す。

      Specified by:
      popByKey in interface org.slf4j.spi.MDCAdapter
      Parameters:
      key - Dequeのキー名
      Returns:
      ポップした値。キーが存在しないかkeyがnullの場合はnull
    • getCopyOfDequeByKey

      指定キーのDequeのコピーを返す。

      返されたDequeはスナップショットであり、以降の変更は反映されない。

      Specified by:
      getCopyOfDequeByKey in interface org.slf4j.spi.MDCAdapter
      Parameters:
      key - Dequeのキー名
      Returns:
      Dequeのコピー。キーが存在しない場合はnull
    • clearDequeByKey

      public void clearDequeByKey(String key)
      指定キーのDequeの全要素をクリアする。

      keyがnullまたはDequeが存在しない場合は何もしない。

      Specified by:
      clearDequeByKey in interface org.slf4j.spi.MDCAdapter
      Parameters:
      key - クリアするDequeのキー名