0

我目前将 Log4J 用于库,并希望转向使用 SLF4J 以允许库的用户选择日志框架。

除了我用来在日志消息进入屏幕或日志之前替换日志消息中的文本的一类之外,一切都很好:

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可以在整个代码库中使用的对应项。XLoggerFactory以和XLoggerin的来源slf4j-ext为例。

于 2013-02-22T15:02:13.687 回答