我目前使用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的依赖?
编辑:为了更清楚,我想在日志消息发送到下游记录器之前自动从日志消息中删除一组字符。
答案 0 :(得分:1)
我认为您可以使用SLF4J的映射诊断上下文功能实现相同的功能。它适用于log4j和logback作为后端。见http://logback.qos.ch/manual/mdc.html
“映射诊断上下文”本质上是由日志框架维护的映射,其中应用程序可以提供键值对,然后日志消息可以将日志消息插入日志消息中。
抱歉,我没有仔细阅读您的代码。我认为SLF4J(仅仅是一个日志记录API)默认情况下不支持这样的过滤器和功能。但是,您可以实现一个在转发日志消息之前处理日志消息的包装器。扩展LoggerWrapper
并创建可在整个代码库中使用的相应LoggerFactory
。请参阅XLoggerFactory
中XLogger
和slf4j-ext
的来源作为示例。