001package com.streamconverter.logging;
002
003import ch.qos.logback.classic.Level;
004import ch.qos.logback.classic.Logger;
005import ch.qos.logback.classic.turbo.TurboFilter;
006import ch.qos.logback.core.spi.FilterReply;
007import com.streamconverter.context.PipelineContext;
008import org.slf4j.Marker;
009
010/**
011 * ログ出力直前にPipelineContextの共有値をMDCへ同期するTurboFilter。
012 *
013 * <p>パイプライン内のあるコマンドが {@link PipelineContext#putShared(String, String)} で設定した値を、
014 * 他のコマンドスレッドのログ出力時に自動的にMDCへ反映する。
015 *
016 * <p>logback.xmlに以下を追加して有効化する:
017 *
018 * <pre>{@code
019 * <turboFilter class="com.streamconverter.logging.PipelineContextTurboFilter"/>
020 * }</pre>
021 */
022public class PipelineContextTurboFilter extends TurboFilter {
023
024  /**
025   * ログイベント発生直前に {@link PipelineContext#syncToMDC()} を呼び出し、 パイプライン共有値を呼び出しスレッドのMDCへ反映する。
026   *
027   * <p>フィルタリングは行わず、常に {@link FilterReply#NEUTRAL} を返す。
028   *
029   * <p>このフィルタはログを発生させたスレッドと同一スレッドで実行されるため、 {@link PipelineContext#syncToMDC()}
030   * によりそのスレッドのMDCのみが更新される。 これは {@link PipelineContext} が {@link ThreadLocal} ベースであるための前提条件であり、
031   * TurboFilter の仕様(ログ発生スレッドでの同期実行)により保証されている。
032   *
033   * @param marker ログマーカー(未使用)
034   * @param logger ログ出力元ロガー(未使用)
035   * @param level ログレベル(未使用)
036   * @param format メッセージフォーマット(未使用)
037   * @param params メッセージパラメータ(未使用)
038   * @param t 例外(未使用)
039   * @return 常に {@link FilterReply#NEUTRAL}
040   */
041  @Override
042  public FilterReply decide(
043      Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
044    PipelineContext.syncToMDC();
045    return FilterReply.NEUTRAL;
046  }
047}