我们在JAVA项目中,通常会使用日志组件打印日志。但是,在日志中不能打印出用户的敏感信息。比如账户号码、群组号码、密码、IP地址等。而在当前的日志中,存在了大量这样的信息,用于定位问题。我们使用的是log4j2组件(log4j 2.7)。如果需要去除这些有敏感信息的打印项,存在几个问题:一、浪费人力,需要逐一去排查;二、去除时,去不干净或者在后续的工作中,又无意识的添加打印了一些敏感信息,不好根除;三、为了去除这些敏感信息,同时也去除了另一部分了信息,而这些信息都是有利于定位问题的信息,去除后使我们分析定位问题更加的困难。
为此我一直在思索,有没有更好的办法?经过几个小时的思索,终于想到了一个解决思路,可不可以在日志的底层去检测这些敏感信息,并对这些敏感信息进行脱敏处理?在网上查阅各种资料,根本没有找到对应的资料。也更加坚定的要解决这个问题的决心,并且要在完成的时候,写一篇博客,让更多有同样需求的人用到。一个偶然的时机,灵感出现了。因为我在项目中打印模式使用的是PatternLayout,我想可不可以试试重写源码中的PatternLayout来实现自定义的Layout。功夫不负有心人,还真的成功了。看效果:
这里简单实现了脱敏号码的功能,对IP的脱敏也可以使用这种方式。其原理是通过log4j内部代码获取到原本最终需要打印的字符串信息,我们通过customize方法对这个字符串信息做我们需要的检测和处理,然后再返回给log4j。
所以此处的作用不光是可以实现数据的脱敏,也可以根据自己的业务需要,对日志进行自行定制,再输出。
使用方式:
1.在customize方法中实现自己的日志定义策略;
2.在log4j2.xml中使用CustomPatternLayout定义Layout
链接:http://download.csdn.net/detail/dongping8887/9836910
内容太多,不方便在此贴源码,已附上源码链接,大家可自行分析,还有不明白的可以通过微信联系我:dongping8887。有更好的方式我们共同讨论、共同学习。