log4j 如何在打 log 的时候屏蔽部分信息?

2019-02-10 13:14:16 +08:00
 xudzhang

有一个 String 类型的变量 httpRequest,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<request username="my_username" password="my_password">
    <do-some-action id="1001">
    </do-some-action>
</request>

希望把这个变量 log 下来,但是 username 和 password 的值不能被 log:

logger.info("HTTP Request: {}", httpRequest);

log 出来最好是像下面的样子,实现这一点有什么好的方法?

<?xml version="1.0" encoding="UTF-8"?>
<request username="******" password="******">
    <do-some-action id="1001">
    </do-some-action>
</request>
2656 次点击
所在节点    Java
2 条回复
PazuLee
2019-02-10 13:23:54 +08:00
日志 log 之前用正则做处理?
freedomSky
2019-02-10 14:09:16 +08:00
覆盖 org.apache.log4j.PatternLayout 这个类,改写里面的 format 方法,我这里原来日志里是
<XXX_PASSWD>我是密码</XXX_PASSWD>
,只是改了 return 那句,供参考

/**
Produces a formatted string as specified by the conversion pattern.
*/
public String format(LoggingEvent event) {
// Reset working stringbuffer
if(sbuf.capacity() > MAX_CAPACITY) {
sbuf = new StringBuffer(BUF_SIZE);
} else {
sbuf.setLength(0);
}

PatternConverter c = head;

while(c != null) {
c.format(sbuf, event);
c = c.next;
}

return sbuf.toString().replaceAll("PASSWD>[^<]*</", "PASSWD>***</");
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/533689

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX