我需要过滤Log4j输出以从日志消息中删除“敏感”信息,例如密码。目标是执行以下操作:
更换:
05-Jan-2018 INFO [org.my.application] Username=Bob Password=myWeakPassword
带有:
05-Jan-2018 INFO [org.my.application] Username=Bob Password=*********
在Log4j V1中,通过扩展PatternLayout类,这很容易做到:
public class CustomPatternLayout extends org.apache.log4j.PatternLayout {
@Override
public String format(LoggingEvent event) {
String temp = super.format(event);
return doFilteringStuff(temp);
}
}
但是,在Log4j V2中,将PatternLayout类设置为“最终”,并且更改了整个体系结构。似乎不再存在一种简单的方法来拦截/覆盖对PatternLayout对象的调用。我查看了Apache documentation,但没有太多信息。
我检查了this question和this question,但是没有人提供太多帮助。
我意识到这是一个非常“笼统”的问题,但是没有人知道在Log4j V2中执行此操作的直接方法,或者对此有任何建议吗?
最佳答案
我认为您要查找的是RewriteAppender。从手册中:
RewriteAppender允许在LogEvent被另一个Appender处理之前对其进行操作。这可用于掩盖敏感信息(例如密码)或将信息注入每个事件。
有关使用RewriteAppender屏蔽敏感内容的完整示例,请参考this answer。