0

私は現在、ライブラリに Log4J を使用していますが、SLF4J の使用に移行して、ライブラリのユーザーがロギング フレームワークを選択できるようにしたいと考えていました。

画面またはログに表示される前に、ログメッセージのテキストを置き換えるために使用する1つのクラスを除いて、すべて問題ありません。

public class FilteringLayout extends PatternLayout {

    private static final String REPLACEMENT = "[APIKEY]";
    private static Pattern replacementPattern = Pattern.compile("DO_NOT_MATCH");

    public static void addReplacementString(String replacementString) {
        replacementPattern = Pattern.compile(replacementString);
    }

    @Override
    public String format(LoggingEvent event) {
        if (event.getMessage() instanceof String) {
            String message = event.getRenderedMessage();

            Matcher matcher = replacementPattern.matcher(message);
            if (matcher.find()) {
                String maskedMessage = matcher.replaceAll(REPLACEMENT);

                Throwable throwable = event.getThrowableInformation() != null
                        ? event.getThrowableInformation().getThrowable() : null;

                LoggingEvent maskedEvent = new LoggingEvent(event.fqnOfCategoryClass,
                        LoggerFactory.getLogger(event.getLoggerName()), event.timeStamp,
                        event.getLevel(), maskedMessage, throwable);

                return super.format(maskedEvent);
            }
        }
        return super.format(event);
    }
}

純粋な SLF4J でこれを行い、Log4J への依存を取り除くにはどうすればよいですか?

編集: わかりやすくするために、一連の文字列をログ メッセージから自動的に削除してから、下流のロガーに送信するようにしたいと考えています。

4

1 に答える 1

1

SLF4Jのマップされた診断コンテキスト機能を使用して同じことを達成できると思います。バックエンドとしてlog4jとlogbackの両方で動作します。http://logback.qos.ch/manual/mdc.htmlを参照してください

SLF4Jのマニュアルからの引用:

「マップされた診断コンテキスト」は、基本的に、アプリケーションがキーと値のペアを提供できるロギングフレームワークによって維持されるマップであり、ログフレームワークによってログメッセージに挿入できます。

編集:

申し訳ありませんが、コードを十分に注意深く読んでいません。SLF4J(単なるロギングAPI)は、デフォルトでそのようなフィルターと機能をサポートしていないと思います。ただし、ログメッセージを転送する前に処理するラッパーを実装することもできます。コードベース全体で使用できる対応するものを拡張LoggerWrapperして作成します。例としてとLoggerFactoryのソースを参照してください。XLoggerFactoryXLoggerslf4j-ext

于 2013-02-22T15:02:13.687 に答える