java - SL4FJ 是否提供与 Log4J PatternLayout 等效的功能?

标签 java log4j slf4j

我目前在库中使用 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 的依赖?

编辑:为了更清楚地说明,我想在将日志消息发送到下游记录器之前自动从日志消息中删除一组字符序列。

最佳答案

我认为您可以使用 SLF4J 的映射诊断上下文功能来实现相同的目标。它可以使用 log4j 和 logback 作为后端。请参阅http://logback.qos.ch/manual/mdc.html

引自SLF4J's manual :

"Mapped Diagnostic Context" is essentially a map maintained by the logging framework where the application can provided key-value pairs, which can then be inserted by the logging framework in log messages.

编辑:

抱歉,我没有仔细阅读您的代码。我认为 SLF4J(只是一个日志 API)默认不支持类似的过滤器和功能。但是,您可以实现一个包装器,在转发日志消息之前对其进行处理。扩展 LoggerWrapper 并创建一个相应的 LoggerFactory,您可以在整个代码库中使用它。以slf4j-extXLoggerFactoryXLogger的源码为例。

关于java - SL4FJ 是否提供与 Log4J PatternLayout 等效的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15026684/

相关文章:

java - 是否有使用消息参数作为属性创建 JSON 对象的 Logback 布局?

java - 每天滚动更新日志文件,无论是否记录任何消息

spring - 使用 Spring 注入(inject) Log4J 记录器

xml - 如何使用 xml 配置 log4j 1.2

java - Log4j2/slf4j - 是否应该从类路径中删除 commons-logging.jar?

java - 如何使用 Klassmaster 混淆 fatJar

java - 创建准备好的语句时,什么原因导致 Spring 1.2 NullPointerException?

java - 时区更改JAVA

java - 通过多个实体进行 hibernate 条件搜索

java - 如何使用 slf4j/log4j2 发送电子邮件通知?