深入了解Java日志框架:JUL、Logback、Log4j及Log4j2的实现与应用
常用的日志记录实现

JUL(java util Logging) logback log4j log4j2
常用的原木幕墙
JCL slf4j
学习视频
七月
JUL(java util logging)是一个原生的 java 日志框架,不需要引用第三方库,相比其他日志框架更容易学习,可以在小型应用中灵活使用。
使用具体的使用方法查看测试用例
具体实施流程:
对数 4j
有关详细信息,请参阅代码 ()
Log4j 主要由 Logger、Appender 和 Layouts 组成
组成。
Logger 控制日志的输出级别以及是否输出日志
Appenders 指定日志的输出方式(输出到控制台、文件等)。
Layout 控制日志输出的格式
JCL :(已停用)。
原木立面
为什么你应该使用 Log Façade
1. 面试接口开发,不依赖特定的实现类,减少代码耦合
2. 项目可以通过导入不同的日志实现类,灵活切换日志框架
3. 统一 API,便于开发人员学习
4. 统一配置,方便管理项目日志开发
我的理解是,当项目需要更改日志框架时,可以灵活更改,无需更改 API,只需更改相应 LogFactory 的相应实现即可。,并且它有默认的加载顺序,如果要添加其他日志框架,则需要更改源码。
SLF4J
绑定日志的实现(export pom 即可完成操作,详见代码)。
1. 添加对 slf4j-api 的依赖
2. 使用 slf4j API 在项目中进行统一日志记录
3. 绑定特定的日志实现框架
3.1 绑定已经实现 SLF4J 的日志框架,直接添加对应的依赖
3.2 如果没有实现 binding,先添加 log 适配器,再添加 implementation 类的依赖
4SLF4J 具有且只有一个日志实现框架的 binding(如果有多个,则默认使用依赖的 log 实现)。
原木桥接
以 log4j 编写的日志在原始项目中使用,但现在更新为 slf4j
只需导入
org.slf4j
log4j-over-slf4j
1.7.25
这样代码就不需要任何更改
桥接和适应不能同时导入
Logback (日志返回)
具体用途要看代码(主要是配置logback.xml)。
日志返回:
主要分为 3 个阶段
logback-core:其他两个模块的基本模块
logback-classic:它是 log4j 的改进版本,并完全实现了 slf4j API
logback-access:访问模块和 servlet 容器提供了通过 HTTP 访问日志的能力
logback 逐个读取类型配置文件
logback.groovy
logback-test.xml
logback.xml 如果它们都不存在,则将使用默认配置
LOGBack 组件
1Logger:日志的 logger,关联到应用对应的上下文后,主要用于存储日志对象,也可以定义日志类型和级别
2Appender:指定日志输出的目的地,可以是控制台、文件、数据库等
2Layout:负责将事件转换为字符串和格式化日志信息。在 logback 中,Layout 对象封装在编码器中。
LOGBack - 访问模块
默认情况下,tomcat 有自己的访问日志,如果需要,可以将其集成到 logback 中以进行统一管理
对数 4j2
log4j2 用于代码示例
Springboot 中的日志记录实现了 Logger
版本升级 – (请注意版本号问题)。
主要讲如何处理每个项目日志的冲突
测试演示:
1. 以上所有项目都是依赖的 jar
2. 主要项目
Log4j 升级到 SLF4j
加
org.slf4j
slf4j-log4j12
1.7.29
然后使用 slf4j 的 logger
LoggerFactory.getLogger(Log4jTest.class);
Log4J2 升级到 SLF4J
加
org.apache.logging.log4j
log4j-slf4j-impl
2.9.1
实际项目情况
场景 1
我们的项目依赖于 A、B 和 C 三个依赖项,它们都分别实现它们
不使用 log4j、log4j2、logback 和 SLF4j log Facade 技术。
如果您未向主项目添加任何日志配置文件,则默认情况下,您将在自己的项目中找到该配置
如果主工程有相关配置,就会使用主工程的配置(log4j2 需要去掉 springboot 本身的 logging 依赖)。
场景 2
都使用 slf4j 来使用 log Facade,但下面 Bing 的具体 log 实现不一致
此时会提示警告,无论先加载哪个 implementation 都会使用全部 implementation。
这种情况下,我们一般需要使用统一的日志实现,否则打印的日志可能会不一致。
可以通过排他性排除引用项目中的依赖项
此时,只剩下两个,其他依赖被统一排除。通过这种方式,实现了团结
情况 3
有些使用 slf4j log 门面,有些使用 log4j(无 log 门面)。
此时不使用 SLF4j 的任何内容都将与主项目的其余日志不一致。格式单独打印。
例如,a 使用 log4j,而其他项目使用 slf4j log façade
此时,我们排除了对依赖 log4j 的锁
Add 在这种情况下,会强制关联 SLF4J 实现统一
org.slf4j
log4j-over-slf4j
1.7.29
如果是 log4j2 (如果两者都有,则将排除两者并添加相应的依赖项)。
需要添加
org.apache.logging.log4j
log4j-to-slf4j
2.12.1