目前,我们通常记录所有进出我们系统的 XML 文档,其中一些包含明文密码。我们希望能够配置正在执行此操作的 logback 记录器/附加器以进行一些模式匹配或类似操作,并且如果它检测到存在密码以替换它(最有可能带有星号)。请注意,我们不想过滤掉日志条目,我们想屏蔽它的一部分。我将不胜感激有关如何使用 logback 完成此操作的建议。谢谢。
2 回答
logback 版本 0.9.27 引入了替换功能。替换支持正则表达式。例如,如果记录的消息是“userid=alice, pswd='my secret'”,并且输出模式是
"%d [%t] $logger - %msg%n",
您只需将模式修改为
"%d [%t] $logger - %replace(%msg){"pswd='.*'", "pswd='xxx'"}%n"
请注意,上面使用了选项引用。
先前的日志消息将输出为“userid=alice, pswd='xxx'”
为了获得出色的性能,您还可以将日志语句标记为机密并指示 %replace 仅对标记为机密的日志语句执行替换。例子,
Marker confidential = MarkerFactory.getMarker("CONFIDENTIAL");
logger.info(confidential, "userid={}, password='{}'", userid, password);
不幸的是,当前版本的 logback 还不支持条件替换(基于标记或其他)。但是,您可以通过扩展 ReplacingCompositeConverter 轻松编写自己的替换代码。如果您需要进一步的帮助,请在 logback-user 邮件列表上大喊。
我相信掩蔽是您业务的一个方面,而不是任何技术或日志系统的方面。在某些情况下,由于法律原因,在将密码、国家身份等存储在数据库中时,它们也应该被屏蔽。您应该能够在将 xml 提供给记录器之前对其进行屏蔽。
一种方法是通过 XSLT 运行 XML,然后将其提供给记录器进行记录。
如果您不想这样做,那么 LogBack 具有过滤器支持,这是一种选择(虽然不是正确的选择)。
但是请理解,您试图在日志基础设施级别找到的任何通用的开箱即用解决方案都将不是最理想的,因为将检查每条日志消息是否被屏蔽。