一起进阶一起拿高工资!Java开发进阶-log4j2日志脱敏原理分析( 二 )


slf4j作为连接log和代码层的中间层 , 我们只要使用slf4j提供的接口 , 不用关心日志的具体实现(想想这样的好处是我们可以把业务系统内日志库比如换为也没问题) 。说起来有点像jdbc , 我们切换不同的数据库 , jdbc帮我们做好了兼容 。
的依赖包有3个 , slf4j和的几个jar包关系作用如下:
3、slf4j和是如何完成绑定的?
从上面图都看到了 , slf4j-api和log4j相关的包根本不在一起 , 那么它们之间是通过什么关联的?
答案是:
slf4j指定路径进行类加载 , log4j必然有桥接实现类 。还是从这行定义和初始化的代码开始看起:
final= .(.class);
从.一直进入到类的bind方法 , 找到thSet = () , 这里即是slf4j完成绑定的地方:
()通过指定路径加载一个类:
指定查找org/slf4j/impl/.class进行加载 。
那么应该在哪里?
当然是在包内了!
通过这个类即完成了slf4j和log4j的绑定 , 看下图 。
绑定完之后即通过方法获取到:
和slf4j完成了绑定 , 那么 , 和本文所说的脱敏原理有什么关系?
脱敏的实现原理真正在于 , 以上只是展开说明日志系统的基本关联原理 , 为接下来讲述log4j的插件机制打个铺垫 。
通过使用插件机制加载各种组件 , 比如, 等 , 我们的脱敏方案编码定义了一个类:
实现了log4j的策略类 , 这其实就是一种插件!
要讲清楚原理得分两部分讲 。
一是log4j.xml配置文件是如何加载的;
二是我们定义的插件又是如何加载注册的 。
4、log4j.xml配置文件是如何加载的?
我们依然是通过断点看源码 , 毕竟 , 源码底下无谎言! 还是从下面这行代码开始看起:
上文已经提到过 , 它继承了r这个抽象类 , 我们直接进入到方法获取的地方:
中文译为"锚" , 这里是通过Java反射得到日志类 , 不为null , 因此进入到后面的语句 。
进入 , 我们的又出现了 , 它在中的静态代码块中已初始化好 。
我们继续到内看:
已初始化好的 , 内部具体如何获取有兴趣可自行debug , 我们进入到ctx.start方法内:
看到()方法 , 就知道log4j准备开始加载配置了!!!再从一直往下看:
687行获取得到一个 , 这是因为我们使用的是xml配置文件!!!正常来说配置文件除了xml , 还有 , yaml , json等 。
此处既然已获得配置文件的内容 ,  那么我们退回去看.().(this,,,cl) 。
看看ory类
指定了xml后缀 , 实际返回
根据的.xml文件 , 进行配置内容加载 。
到这里xml配置就算是加载完成啦 。xml里面定义的标签也会被加载 。
接下来 , 自然而然的我们就会问 , 这个标签和代码@注解定义的插件是如何关联起来的?或者又说插件是如何加载的?
5、我们定义的插件又是如何加载注册的?
log4j中的注解提供了一种便捷的方法将一个类声明成的插件 , 比如我单测用到的案例:
在加载上下文的时候会加载 , log4j统一用注册中心加载和注册插件 , 并由来管理 。
进入到:
注释都写得很清楚 , 从指定的指定文件.dat加载插件 , 继续进入der方法
不同模块不同jar包都有可能存在.dat文件 , 比如log4j-core包存在