在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析。在 Java 领域里存在着多种日志框架,如 JCL、SLF4J、Jboss-logging、jUL、log4j、log4j2、logback 等等。

日志框架的选择

市面上常见的日志框架有很多,它们可以被分为两类:日志门面(日志抽象层)和日志实现,如下表。

日志分类 描述 举例
日志门面(日志抽象层) 为 Java 日志访问提供一套标准和规范的 API 框架,其主要意义在于提供接口。 JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)、jboss-logging
日志实现 日志门面的具体的实现 Log4j、JUL(java.util.logging)、Log4j2、Logback

通常情况下,日志由一个日志门面与一个日志实现组合搭建而成,Spring Boot 选用 SLF4J + Logback 的组合来搭建日志系统。

SLF4J 是目前市面上最流行的日志门面,使用 Slf4j 可以很灵活的使用占位符进行参数占位,简化代码,拥有更好的可读性。

Logback 是 Slf4j 的原生实现框架,它与 Log4j 出自一个人之手,但拥有比 log4j 更多的优点、特性和更做强的性能,现在基本都用来代替 log4j 成为主流。

SLF4J 的使用

在项目开发中,记录日志时不应该直接调用日志实现层的方法,而应该调用日志门面(日志抽象层)的方法。

在使用 SLF4J 记录日志时,我们需要在应用中导入 SLF4J 及日志实现,并在记录日志时调用 SLF4J 的方法,例如:


  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. public class HelloWorld {
  4. public static void main(String[] args) {
  5. Logger logger = LoggerFactory.getLogger(HelloWorld.class);
  6. //调用 sl4j 的 info() 方法,而非调用 logback 的方法
  7. logger.info("Hello World");
  8. }
  9. }

SLF4J 作为一款优秀的日志门面或者日志抽象层,它可以与各种日志实现框架组合使用,以达到记录日志的目的,如下图(参考自 SLF4J 官方)。

图1:SLF4J 的使用方案

从 SLF4J 官方给出的方案可以看出:

  • Logback 作为 Slf4j 的原生实现框架,当应用使用 SLF4J+Logback 的组合记录日志时,只需要引入 SLF4J 和 Logback 的 Jar 包即可;
  • Log4j 虽然与 Logback  出自同一个人之手,但是 Log4j 出现要早于 SLF4J,因而 Log4j 没有直接实现 SLF4J,当应用使用 SLF4J+Log4j 的组合记录日志时,不但需要引入 SLF4J 和 Log4j 的 Jar 包,还必须引入它们之间的适配层(Adaptation layer)slf4j-log4j12.jar,该适配层可谓“上有老下有小”,它既要实现 SLF4J 的方法,还有调用 Log4j 的方法,以达到承上启下的作用;
  • 当应用使用 SLF4J+JUL 记录日志时,与 SLF4J+Log4j 一样,不但需要引入 SLF4J 和 JUL 的对应的 Jar 包,还要引入适配层 slf4j-jdk14.jar。

这里我们需要注意一点,每一个日志的实现框架都有自己的配置文件。使用 slf4j 记录日志时,配置文件应该使用日志实现框架(例如 logback、log4j 和 JUL 等等)自己本身的配置文件。

统一日志框架(通用)

通常一个完整的应用下会依赖于多种不同的框架,而且它们记录日志使用的日志框架也不尽相同,例如,Spring Boot(slf4j+logback),Spring(commons-logging)、Hibernate(jboss-logging)等等。那么如何统一日志框架的使用呢?

对此,SLF4J 官方也给出了相应的解决方案,如下图。

图2:统一日志框架的使用方案

从上图中可以看出,统一日志框架一共需要以下 3 步 :

  1. 排除应用中的原来的日志框架;
  2. 引入替换包替换被排除的日志框架;
  3. 导入 SLF4J 实现。

SLF4J 官方给出的统一日志框架的方案是“狸猫换太子”,即使用一个替换包来替换原来的日志框架,例如 log4j-over-slf4j 替换 Log4j(Commons Logging API)、jul-to-slf4j.jar 替换 JUL(java.util.logging API)等等。

替换包内包含被替换的日志框架中的所有类,这样就可以保证应用不会报错,但替换包内部实际使用的是 SLF4J API,以达到统一日主框架的目的。

统一日志框架(Spring Boot)

我们在使用 Spring Boot 时,同样可能用到其他的框架,例如 Mybatis、Spring MVC、 Hibernate 等等,这些框架的底层都有自己的日志框架,此时我们也需要对日志框架进行统一。

我们知道,统一日志框架的使用一共分为 3 步,Soring Boot 作为一款优秀的开箱即用的框架,已经为用户完成了其中 2 步:引入替换包和导入 SLF4J 实现。

Spring Boot 的核心启动器 spring-boot-starter 引入了 spring-boot-starter-logging,使用 IDEA 查看其依赖关系,如下图。

图3:spring-boot-starter-logging 依赖关系图

从图 3 可知,spring-boot-starter-logging 的 Maven 依赖不但引入了 logback-classic (包含了日志框架 SLF4J 的实现),还引入了 log4j-to-slf4j(log4j 的替换包),jul-to-slf4j (JUL 的替换包),即 Spring Boot 已经为我们完成了统一日志框架的 3 个步骤中的 2 步。

SpringBoot 底层使用 slf4j+logback 的方式记录日志,当我们引入了依赖了其他日志框架的第三方框架(例如 Hibernate)时,只需要把这个框架所依赖的日志框架排除,即可实现日志框架的统一,示例代码如下。

<dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-console</artifactId><version>${activemq.version}</version><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency>

12. Spring Boot统一日志框架相关推荐

  1. Spring Boot统一日志框架

    在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析.在 Java 领域里存在着多种日志框架,如 JCL.SLF4J.Jboss-logging.jUL.log4j. ...

  2. 【spring boot】8.spring boot的日志框架logback使用

    在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. 参考:http://tengj.top/2017/04/05/springbo 开篇之前,贴上完整applica ...

  3. spring boot—默认日志框架配置

    文章目录 默认日志框架--配置全解 日志格式 日志级别 日志输出到控制台 日志输出到文件 spring boot2.2.4官方文档 默认日志框架–配置全解 #日志记录 logging:#日志级别lev ...

  4. Spring boot切换日志框架

    切换日志框架 可以按照,SLF4J日志适配图,进行切换 slf4j+log4j 切换为,slf4j+log4j方式 <dependency><groupId>org.sprin ...

  5. Spring boot统一日志记录

    统一日志记录 开发的时候 用到都是一个框架 很多的框架(slf4j+logback): Spring(commons-logging) Hibernate(jboss-logging) MyBatis ...

  6. Spring Boot + Log4j2 日志框架配置 (Maven)

    参考Spring Boot官方文档 日志部分 Spring Boot默认情况下,当使用"Starters" 使用Logback输出日志 , 还包括适当的Logback路由, 确保其 ...

  7. Spring Boot中日志框架的使用——Logback

    在SpringBoot中可以使用的日志框架有很多,这里选用的是Logback,SpringBoot的version是2.1.7 准备工作 第一步先添加一个依赖 <dependency>&l ...

  8. spring Boot 2 运维篇(spring boot程序的打包与部署,多环境开发配置文件的配置,spring boot集成日志框架)

    目录 1.SpringBoot程序的打包与运行 程序打包 程序运行 SpringBoot程序打包失败处理 命令行启动常见问题及解决方案 SpringBoot项目快速启动(Linux版) 2.配置高级 ...

  9. 蚂蚁金服开源增强版 Spring Boot 的研发框架!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:gitee.com/sofastack/sofa-b ...

最新文章

  1. 连续写博客2个月之后,我感觉自己的心态有了一些变化
  2. 单片机原理及其应用——单片机控制单个发光二极管实验(附超详细的C51单片机实验教程)
  3. Eevnt Loop (事件循环)
  4. 总结div里面水平垂直居中的实现方法
  5. Python开发【第二篇】:初识Python
  6. react build后直接从浏览器打开
  7. java除了框架还需要什么_除了框架,前端面试还问什么
  8. 前端从入门到精通(记录自己的前端学习之路)都是一些自己做的笔记
  9. Python-Pandas-Excel/CSV 数据处理大全整理 (二)
  10. 我在雷军2021年度演讲上,依稀仿佛看到了老罗的影子
  11. halcon第七讲:基于训练学习的颜色检测
  12. gtk如何修改combobox的下拉箭头_如何管理你的思维导图?
  13. 电脑计算机提示msvcr100.dll丢失如何修复,msvcr100.dll丢失的解决方法
  14. mpi_barrier
  15. 加载linux驱动模块时,终端提示一堆内存错误
  16. 下半年重要的10大美国写作比赛不要错过
  17. php laravel入口文件,Laravel学习教程之从入口到输出过程详解
  18. openstack 【T版】(五)——部署nova组件
  19. 仿小米官网登录功能的实现
  20. OSPF中Stub、完全Stub、NSSA、完全NSSA区域

热门文章

  1. professional issue复习
  2. 科技是国之利器,人工智能与机器人发展势不可当
  3. pytorch中保存、载入权重
  4. Windows控制台的打开方式
  5. 计算二维紧束缚模型费米面和nesting程序新思路
  6. Power Platform实战技术分享
  7. 15.在springboot中的事务处理
  8. 你真的了解java编译优化吗?15个问题考察自己是否理解
  9. Linux 学习笔记2 常用命令
  10. STM32驱动陀螺仪MPU6050的应用实例