DC娱乐网

基于logback下的日志脱敏实现

在如今,信息安全已经成为一个企业非常重要的事情,信息安全这块挡板没有守住,轻则导致企业经济损失,重则导致企业破产,甚至还

在如今,信息安全已经成为一个企业非常重要的事情,信息安全这块挡板没有守住,轻则导致企业经济损失,重则导致企业破产,甚至还有可能会承担刑事责任,信息安全涉及到方方面面,而作为应用日志,最有可能成为信息泄露的源头,该如何防范,日志如何进行敏感信息的脱敏处理?

一、日志框架的分类

在java体系,日志基本都是基于log4这个体系下进行日志的输出,在java体系中有log4j、log4j2,logback以及SLF4J,这几个很多人都分不清楚。

Log4j是一个非常老的日志框架,然后log4j2是在log4j进行升级,修复了很多log4j存在的问题,并在此基础上增加对于SLF4J的支持,而logback又是log4j作者新开发的新一代日志框架,它的适应性更强、性能更好,也能很好的支持SLF4J

SLF4J是日志的一个门面,它相当于对外提供了统一的日志接口,不管是log4j2还是logback都支持SLF4J

总之,日志框架选择logback就对了,其他的都是老一代的日志框架,日志门面选择SLF4J就行,了这样就算是后续有换日志框架的需求也能很轻松的在多个日志框架中灵活切换。

既然选择了基于logback作为我们的日志框架,那么日志的脱敏工作又降如何展开,要了解这些,首先得从logback的架构说起

二、Logback的架构

在工程层面:整个logback主要由三个工程组成,logback-core、logback-classic 和 logback-access。logback-core是其他两个工程的基础,logback-classic是基于logback-core的一个扩展包,在这个工程上实现了对于SLF4J API的支持,而logback-access是为了于Servlet容器进行集成的一个工程。

在组件层面:整个logback框架主要由三个非常重要的组件构成,logger、appender、layout,当然还有一些是围绕着这三个组件的一些次核心的东西,比如日志的级别Level、日志的配置文件Configuration File、日志的事件LoggingEvent、日志的上下文LoggerContext,日志的过滤器Filter等等

Logger日志记录器:主要是用于记录日志的消息,它包含了对于日志的命名空间的定义和打印的日志级别。

appender日志输出器:可以让日志输出到控制台Console,也可以让日志输出到文件File,还能通过邮件进行日志输出等等。

layout日志格式的定义:日志的输出格式基本都是由它定义的,包括日志时间、级别、内容等,logback也内置了非常多的日志格式,如JSON、HTML、Patter、XML等

<!--Appender--><appender name="STDOUT">前面了解完了logback整体的架构以及对应的一些核心组件,相信大家对于logback有了一个基本的认识了,那么在logback中实现日志脱敏呢?通过各个组件的关系,不难看出,logback给我们提供了非常多的可扩展点的地方。

一、通过Converter接口去做消息体的转换:通过实现Converter去转换日志格式

public SensitiveLogbackConverter extends ClassicConverter { @Override public String convert(ILoggingEvent iLoggingEvent) { String originalMessage = iLoggingEvent.getFormattedMessage(); ........ }}

二、通过Layout接口进行扩展,从而实现日志格式的转换。

public SensitiveLogbackLayout extends PatternLayout { @Override public String doLayout(ILoggingEvent event) { String originalMessage = super.doLayout(event); ...... }}

三、可以通过实现Filter实现对于消息体的转换,不过从职责来看,这主要是作为日志过滤的,不太适合在这里进行日志的转换操作

public SensitvieLogbackFilter extends Filter<ILoggingEvent>{ @Override public FilterReply decide(ILoggingEvent event) { String originalMessage= event.getMessage(); ....... }}

从每个类各自的职能来看,优先推荐使用Convert接口,其次是Layout接口,对于Filter接口不太建议使用它来做日志格式转换,毕竟它这个接口的定义主要是用于日志过滤使用的。

第三方基于logback的脱敏组件

可能有人问,有没有一些第三方基于logback的脱敏组件,答案是肯定的,在github上面找到一款可以基于logback进行日志脱敏的组件sensitive,源码地址:https://github.com/houbb/sensitive.git。

它主要有以下特点:

1、能支持logback、log4j2等常用的java 日志框架

2、采用比较简单的注解方式,通过对需要脱敏的字段进行添加“sensitive”即可,内置了非常多的常用脱敏的注解字段,如手机号码、身份证、银行卡、地址等

3、能够低成本在老系统实现基于全局日志的脱敏。

当然还有其他好用的特性,可以体验慢慢尝试去发现,整个组件使用还是非常简单的。

........

但从目前来看,也存在一些没有很好解决的地方

1、对于集合、数组、map等类型的实现不是太好,要么没有实现,要么实现的性能大打折扣

2、整个对象的脱敏过程是通过JSON在中间进行转换,在性能方面存在一些损耗。

当然如果是一些偏后端的业务系统,对于性能要求不高,是可以尝试着使用,对于一些面向流量较高的系统,建议还是采用性能更好的实现方式,可能更合适。