Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SL4FJ是否提供与Log4J PatternLayout相同的功能?_Java_Log4j_Slf4j - Fatal编程技术网

Java SL4FJ是否提供与Log4J PatternLayout相同的功能?

Java SL4FJ是否提供与Log4J PatternLayout相同的功能?,java,log4j,slf4j,Java,Log4j,Slf4j,我目前在库中使用Log4J,并希望使用SLF4J来允许库的用户选择日志框架 除了我用来在日志消息进入屏幕或日志之前替换其文本的一个类之外,一切都很好: public class FilteringLayout extends PatternLayout { private static final String REPLACEMENT = "[APIKEY]"; private static Pattern replacementPattern = Pattern.compil

我目前在库中使用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作为后端。看

引自:

“映射的诊断上下文”本质上是由日志框架维护的映射,应用程序可以在其中提供键值对,然后日志框架可以将键值对插入日志消息中

编辑:
对不起,我没有仔细阅读你的代码。我认为SLF4J(只是一个日志API)默认情况下不支持过滤器和类似的功能。但是,您可以实现一个包装器,在转发日志消息之前对其进行处理。扩展
LoggerWrapper
并创建一个相应的
LoggerFactory
,您可以在整个代码库中使用它。请参见
slf4j ext
中的
XLoggerFactory
XLogger
的源代码作为示例。

不完全是我想要的。我不需要将任何内容传递给后续的记录器,我希望检查发送给该记录器的每一行,并从日志文本中删除特定的字符序列。谢谢您的回答。在进一步思考“问题”之后,我意识到也许最好的方法是将日志过滤留给最终客户机。SLF4J只是一个表面,您使用的是什么?您仍然可以针对SLF4J API编写代码,并使用Log4J进行实际的日志记录。