使用Logback屏蔽密码?

时间:2011-01-05 18:37:30

标签: java logging passwords masking logback

我们目前通常会记录进出系统的所有XML文档,其中一些文档包含明确的密码。我们希望能够配置执行此操作的logback logger / appender来执行某些模式匹配或类似操作,如果它检测到存在替换它的密码(最有可能使用星号)。注意我们不想过滤掉日志条目,我们想要屏蔽它的一部分。我很感激有关如何使用logback完成此操作的建议。感谢。

2 个答案:

答案 0 :(得分:18)

logback版本0.9.27引入了replacement capability。替换支持正则表达式。例如,如果记录的消息是“userid = alice,pswd ='my secret'”,输出模式是

  "%d [%t] $logger - %msg%n",

你只需将模式修改为

 "%d [%t] $logger - %replace(%msg){"pswd='.*'", "pswd='xxx'"}%n"

请注意,上述内容使用option quoting

以前的日志消息将输出为“userid = alice,pswd ='xxx'”

对于超强性能,您还可以将日志语句标记为CONFIDENTIAL,并指示%replace仅对标记为CONFIDENTIAL的日志语句执行替换。例如,

 Marker confidential = MarkerFactory.getMarker("CONFIDENTIAL");
 logger.info(confidential, "userid={}, password='{}'", userid, password);

不幸的是,当前版本的logback还不支持条件替换(基于标记或其他)。但是,您可以通过扩展ReplacingCompositeConverter轻松编写自己的替换代码。如果您需要进一步的帮助,请在logback用户邮件列表上大喊。

答案 1 :(得分:1)

我认为Masking是您业务的一个方面,而不是任何技术或日志系统的方面。在某些情况下,由于法律原因,密码,国家身份等应该在将其存储在数据库中时被屏蔽。您应该能够在将xml提供给记录器之前屏蔽它。

执行此操作的一种方法是通过XSLT运行XML,然后将其提供给记录器进行记录。

如果你不想这样做,那么LogBack有Filters support这是一个选项(虽然不是正确的)。

但要明白,您在日志记录基础结构级别尝试查找的任何通用开箱即用解决方案都将不是最理想的,因为每个日志消息都将被检查以进行屏蔽。