log4j2(一) 获取 ILoggerFactory

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j2(一) 获取 ILoggerFactory相关的知识,希望对你有一定的参考价值。

参考技术A 关于log4j2的初始化流程,现在项目基本都是springboot项目,就需要结合 springboot 源码来解析,这块可以参考 Springboot - Log4J2LoggingSystem源码解析

因为spring-boot-starter依赖中日志使用的是spring-boot-starter-logging,这里面是用的是logback,所以需要先剔除此依赖

再添加log4j2依赖

如果我们想使用 yml 后缀的配置文件还需要再加一个依赖

然后相关依赖版本如下

以下源码基于 log4j 2.7。

先看一张log4j官方提供的类图

先简单了解一下这些类

过滤器的种类也很多,比如根据日志级别。Filter会返回一个枚举值Filter.Result,有三种:

详细参见 log4j - Filters

log4j的初始化流程实在有点饶,这里简要讲讲。

LoggerFactory#getLogger(String)

在只有一个log4j2的依赖时,加载流程大致如下:

在 getILoggerFactory() 方法中做了这么几件事

再看下 log4j2 的 StaticLoggerBinder 源码

下一篇看看后续Logger的获取。

添加 logback 依赖(直接放开 spring-boot-starter-logging 也行),这样我们项目就有两个 org/slf4j/impl/StaticLoggerBinder.class 了

然后启动,提示

我的疑问就是为啥不用log4j2而用logback,就打开这个网址查了下,里面最后有一段

告诉我们

好吧,随机的我也是醉了。。

参考
http://logging.apache.org/log4j/2.x/log4j-users-guide.pdf
http://www.slf4j.org/codes.html#multiple_bindings

回家,风雨兼程。

以上是关于log4j2(一) 获取 ILoggerFactory的主要内容,如果未能解决你的问题,请参考以下文章

在 log4j2 中从 ThreadContext 设置和获取值

纠结哇!日志框架选型,Logback 还是 Log4j2?

即使在使用 Vert.x 和 Log4j2 将“isThreadContextMapInheritable”设置为 true 后也没有获取 ThreadContext 值

在 log4j2 模式布局中使用 Sleuth 跟踪和跨度 id

Log4j2 - 配置

log4j2 中基于时间的触发策略