交错的日志系统、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 集成日志框架相关推荐

  1. 【Java从0到架构师】Zookeeper - 系统高可用、分布式的基本概念、Zookeeper 应用场景

    分布式基石 Zookeeper 框架全面剖析 系统高可用 集群 - 主备集群.主从集群.普通集群 分布式(系统部署方式) 微服务(架构设计方式) 分布式的基本概念 分布式存储.分布式计算 分布式协调服 ...

  2. 【Java从0到架构师(1),Java中高级面试题总结(全面)

    JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...

  3. 【Java从0到架构师】SpringCloud - Sleuth、Zipkin、Config

    SpringCloud 链路追踪组件 Sleuth Zipkin 分布式配置中心 - Config Git + Config 分布式配置中心 Java 从 0 到架构师目录:[Java从0到架构师]学 ...

  4. 【Java从0到架构师】SpringCloud - Hystrix、Zuul

    SpringCloud 基本概念 熔断和降级 服务雪崩效应 服务熔断与降级 - Hystrix SpringBoot 集成 Hystrix 熔断降级服务异常报警通知 重点属性 - 熔断隔离策略.超时时 ...

  5. 【Java从0到架构师】SpringCloud - Eureka、Ribbon、Feign

    SpringCloud 分布式.微服务相关概念 微服务框架构选型 SpringCloud 概述 服务注册与发现 - Eureka 案例项目 Eureka 自我保护机制 微服务调用方式 - Ribbon ...

  6. 【Java从0到架构师】RocketMQ 使用 - 集成 SpringBoot

    RocketMQ 消息中间件 集成 SpringBoot 入门案例 生产消息类型 - 同步.异步.一次性 消费模式 - 集群.广播 延时消息 设置消息标签 设置消息的 Key 自定义属性设置 消息过滤 ...

  7. 【Java从0到架构师】RocketMQ 使用 - 发送消息、接收消息、特殊消息

    RocketMQ 消息中间件 入门案例 NameServer 地址 发送消息 同步发送消息 异步发送消息 一次性发送消息 生产者组.消息封装 接收消息 消费方式:推式消费.拉式消费 消息方式:集群模式 ...

  8. 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装

    RocketMQ 消息中间件 基础知识 消息中间件的应用 异步解耦 削峰填谷 消息分发 RocketMQ 核心组件 RocketMQ 安装 源码安装 修改配置参数 启动 管理控制台安装 测试项目 Ja ...

  9. 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级

    Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...

最新文章

  1. WebGIS--ArcGIS for Flex系列开发一:flash builder
  2. python 两个[]_Python中的两个测试工具
  3. Papar Notes List
  4. 没有理智的欲望会走向毁灭,没有欲望的理智会永守清贫
  5. 贪心——FatMouse' Trade(hdu1003)
  6. 指针 数组指针 指针数组 函数指针等说明。
  7. C++嵌入Python,以及两者混用
  8. jsp还能引用项目外的js,css啊
  9. Platform回获取一些系统的路径和参数
  10. atitit。mssql sql server 转换mysql 及 分页sql ast的搭建
  11. hdl四位二进制计数器_用Verilog HDL设计一个4位BCD码计数器
  12. HCNE实验指导文档(全)
  13. OpenCV案例(五): 更换背景色
  14. 【AnySDK】接入必读及常见问题
  15. 可视化全链路日志追踪
  16. 2017工业互联网峰会 | 天拓四方助力中国工业生产、制造业转型升级
  17. python存数据库c读数据库喷码加工_python图片文字识别
  18. 设置Ajax为同步请求
  19. Python数据分析 ---- ARMA模型
  20. CentOS系统的安装

热门文章

  1. 成功的捷径,学会这一点,赚钱很容易
  2. 查看java堆的详细信息
  3. 互联网公司大厂中厂小厂分别指哪些公司?
  4. python入门——P40类和对象:一些相关的BIF
  5. JS字符串转换为数字,Number(),parseInt()和parseFloat()的区别
  6. ecos中的spl同步机制
  7. apt-get命令_DBATools中的Get-DbaHelpIndex命令
  8. @sql 单元测试_简单单词中使用tSQLt进行的常规SQL单元测试
  9. SQL Server安全性和基于策略的管理–高级条件
  10. tde数据库加密_启用了基于透明数据加密(TDE)的地理复制的Azure SQL数据库