0、背景
zookeeper服务端所使用的日志框架被我替换为了log4j2,zk的sessionid又被负责安全的大佬评估为敏感信息,不能直接打印,所以要想一个在不修改源码的情况快速解决sessionid打印屏蔽的办法。
1、log4j2的replace功能
很多日志框架都有过滤替换的功能,log4j2也不例外,支持正则替换。 先看zk的sessionid生成方法 sessionid高位为服务id,中间为时间戳,低位为递增序列,最大值为Long的最大值。
log4j2.properties的pattern中增加正则表达式
appender.rolling.layout.pattern
= %d %p %c
{1.
} [%t
] %replace
{%msg
}{0x
[a-f0-9
]{15,
}|0x0
}{0x*
} -%replace
{%ex
}{0x
[a-f0-9
]{15,
}|0x0
}{0x*
}%n
appender.rolling.layout.alwaysWriteExceptions
=false
这里不仅replace了msg,还replace了ex,因为log4j2中异常是单独区分的,正常日志和异常日志中均有可能出现sessionid,因此要同时对msg和ex配置replace。appender.rolling.layout.alwaysWriteExceptions默认是开启的,既然已经在pattern中配置了ex就要关闭alwaysWriteExceptions。 最终完美替换所有sessionid为0x*