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}