我目前在库中使用 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-ext
中XLoggerFactory
和XLogger
的源码为例。
关于java - SL4FJ 是否提供与 Log4J PatternLayout 等效的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15026684/