【Java从0到架构师】交错的日志系统、SpringBoot 集成日志框架
交错的日志系统、SpringBoot 集成日志框架
- 交错复杂的日志系统① - 多个项目实现 SLF4J 门面
- 交错复杂的日志系统② - 统一底层实现为 Logback
- 交错复杂的日志系统③ - 统一底层实现为 Log4j 2.x
- 解决方案1
- 解决方案2
- 日志依赖总结
- SpringBoot 集成日志框架
- SpringBoot 集成 Logback
- SpringBoot 集成 Log4j 2.x
- SpringBoot 的 logging 配置 (application)
Java 从 0 到架构师目录:【Java从0到架构师】学习记录
Gitee 代码:https://gitee.com/szluyu99/mj_java_frame/tree/master/04_SpringBoot
在实际开发过程中,不同的库(项目)内部使用的日志系统不一定相同
- 当多个带有日志系统的项目混合在一起时,日志系统可能就会变得有点复杂,甚至产生冲突
在上图中,3 个项目的日志系统可以互不影响、独立运行
交错复杂的日志系统① - 多个项目实现 SLF4J 门面
上图中,SLF4J 发现有 3 种实现,会发生冲突,最终会选择其中一 种覆盖其他实现
可以根据自己的需要排除掉 2 种实现,剩下 1 种想要的实现:
- 剩下 Logback 实现:
*剩下 Log4j 2.x 实现
交错复杂的日志系统② - 统一底层实现为 Logback
如果希望将所有的日志系统进行统一,比如底层都使用 Logback,解决方案:
- 排除 Log4j 1.x、Log4j 2.x
- 增加 Log4j 1.x 转为调用 SLF4J 的包:log4j-over-slf4j
- 增加 Log4j 2.x 转为调用 SLF4J 的包:log4j-to-slf4j
<!-- log4j 1.x的盗版实现,内部会调用SLF4J -->
<dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>1.7.30</version>
</dependency><!-- log4j 2.x的盗版实现,内部会调用SLF4J -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-to-slf4j</artifactId><version>2.13.3</version>
</dependency>
最终实现的结构:
交错复杂的日志系统③ - 统一底层实现为 Log4j 2.x
如果希望将所有的日志系统进行统一,比如底层都使用 Log4j 2.x
解决方案1
- 排除 Log4j 1.x、Logback
- 增加 Log4j 1.x 转为调用 SLF4J 的包:log4j-over-slf4j
- 增加 Log4j 2.x 与 SLF4J 的适配包:log4j-slf4j-impl
<dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>1.7.30</version>
</dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.13.3</version>
</dependency>
最终实现的结构:
解决方案2
- 排除 Log4j 1.x、Logback
- 增加 Log4j 1.x 转为调用 Log4j 2.x 的包:log4j-1.2-api
- 增加 Log4j 2.x 与 SLF4J 的适配包:log4j-slf4j-impl
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-1.2-api</artifactId><version>2.14.0</version>
</dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.13.3</version>
</dependency>
最终实现结构:
日志依赖总结
门面接口:
- log4j-api:门面接口(log4j 2.x)
- slf4j-api:门面接口
日志实现:
- logback-classic:实现了 slf4j-api 门面接口的日志实现框架
- log4j-core:实现了 log4j-api 门面接口的日志实现框架(log4j 2.x)
- log4j:log4j 1.x 的日志实现框架
与 SLF4J 的适配包:
- slf4j-log4j12:实现了 slf4j-api 门面接口,它的内部会调用 log4j
- log4j-slf4j-impl:实现了 slf4j-api 门面接口,它的内部会调用 log4j-core
logback 默认就是实现了 slf4j-api 门面接口
- log4j-over-slf4j:log4j 的盗版实现,它的内部会调用 slf4j-api
- log4j-1.2-api:log4j 的盗版实现,它的内部会调用 log4j-core
- log4j-to-slf4j:log4j-core 的盗版实现,它的内部会调用 slf4j-api
SpringBoot 集成日志框架
在 SpringBoot 中,日志框架的建议:
- SLF4J + Logback
- SLF4J + Log4j 2.x
参考:官方文档
SpringBoot 集成 Logback
SpringBoot 默认已经继承了 Logback,不用再添加 Logback 的依赖,配置文件位置是:
- classpath:logback.xml
- classpath:logback-spring.xml(SpringBoot 推荐)
SpringBoot 内置的 Logback 配置
- spring-boot.jar
- org/springframework/boot/logging/logback/defaults.xml
SpringBoot 集成 Log4j 2.x
方法1:通过 <exclusion> 标签排除包
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- 去掉logging --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!-- 添加Log4j2的starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>
</dependencies>
方法2:使用一个版本号不存在的依赖覆盖原来的依赖:
<dependencies><!-- 使用不存在的版本号覆盖依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><version>0</version></dependency><!-- 添加Log4j2的starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>
</dependencies>
配置文件的位置应该是:
- classpath:log4j2.xml
- classpath:log4j2-spring.xml(SpringBoot 推荐)
SpringBoot 内置的 Log4j 2.x 默认配置
- spring-boot.jar
- org/springframework/boot/logging/log4j2/log4j2.xml
SpringBoot 的 logging 配置 (application)
设置日志级别:
logging:level:root: infocom.mj.dao: debugcom.mj.controller: debug
自定义配置文件的路径:
logging:config: classpath:log4j2-spring.xml
定义日志组:
logging:level:root: infoproject: debuggroup:project:- com.mj.dao- com.mj.controller
【Java从0到架构师】交错的日志系统、SpringBoot 集成日志框架相关推荐
- 【Java从0到架构师】Zookeeper - 系统高可用、分布式的基本概念、Zookeeper 应用场景
分布式基石 Zookeeper 框架全面剖析 系统高可用 集群 - 主备集群.主从集群.普通集群 分布式(系统部署方式) 微服务(架构设计方式) 分布式的基本概念 分布式存储.分布式计算 分布式协调服 ...
- 【Java从0到架构师(1),Java中高级面试题总结(全面)
JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...
- 【Java从0到架构师】SpringCloud - Sleuth、Zipkin、Config
SpringCloud 链路追踪组件 Sleuth Zipkin 分布式配置中心 - Config Git + Config 分布式配置中心 Java 从 0 到架构师目录:[Java从0到架构师]学 ...
- 【Java从0到架构师】SpringCloud - Hystrix、Zuul
SpringCloud 基本概念 熔断和降级 服务雪崩效应 服务熔断与降级 - Hystrix SpringBoot 集成 Hystrix 熔断降级服务异常报警通知 重点属性 - 熔断隔离策略.超时时 ...
- 【Java从0到架构师】SpringCloud - Eureka、Ribbon、Feign
SpringCloud 分布式.微服务相关概念 微服务框架构选型 SpringCloud 概述 服务注册与发现 - Eureka 案例项目 Eureka 自我保护机制 微服务调用方式 - Ribbon ...
- 【Java从0到架构师】RocketMQ 使用 - 集成 SpringBoot
RocketMQ 消息中间件 集成 SpringBoot 入门案例 生产消息类型 - 同步.异步.一次性 消费模式 - 集群.广播 延时消息 设置消息标签 设置消息的 Key 自定义属性设置 消息过滤 ...
- 【Java从0到架构师】RocketMQ 使用 - 发送消息、接收消息、特殊消息
RocketMQ 消息中间件 入门案例 NameServer 地址 发送消息 同步发送消息 异步发送消息 一次性发送消息 生产者组.消息封装 接收消息 消费方式:推式消费.拉式消费 消息方式:集群模式 ...
- 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装
RocketMQ 消息中间件 基础知识 消息中间件的应用 异步解耦 削峰填谷 消息分发 RocketMQ 核心组件 RocketMQ 安装 源码安装 修改配置参数 启动 管理控制台安装 测试项目 Ja ...
- 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级
Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...
最新文章
- WebGIS--ArcGIS for Flex系列开发一:flash builder
- python 两个[]_Python中的两个测试工具
- Papar Notes List
- 没有理智的欲望会走向毁灭,没有欲望的理智会永守清贫
- 贪心——FatMouse' Trade(hdu1003)
- 指针 数组指针 指针数组 函数指针等说明。
- C++嵌入Python,以及两者混用
- jsp还能引用项目外的js,css啊
- Platform回获取一些系统的路径和参数
- atitit。mssql sql server 转换mysql 及 分页sql ast的搭建
- hdl四位二进制计数器_用Verilog HDL设计一个4位BCD码计数器
- HCNE实验指导文档(全)
- OpenCV案例(五): 更换背景色
- 【AnySDK】接入必读及常见问题
- 可视化全链路日志追踪
- 2017工业互联网峰会 | 天拓四方助力中国工业生产、制造业转型升级
- python存数据库c读数据库喷码加工_python图片文字识别
- 设置Ajax为同步请求
- Python数据分析 ---- ARMA模型
- CentOS系统的安装
热门文章
- 成功的捷径,学会这一点,赚钱很容易
- 查看java堆的详细信息
- 互联网公司大厂中厂小厂分别指哪些公司?
- python入门——P40类和对象:一些相关的BIF
- JS字符串转换为数字,Number(),parseInt()和parseFloat()的区别
- ecos中的spl同步机制
- apt-get命令_DBATools中的Get-DbaHelpIndex命令
- @sql 单元测试_简单单词中使用tSQLt进行的常规SQL单元测试
- SQL Server安全性和基于策略的管理–高级条件
- tde数据库加密_启用了基于透明数据加密(TDE)的地理复制的Azure SQL数据库