优雅哥 SpringBoot 2.7.2 实战基础 - 07 - 日志配置
Java 中日志相关的 jar 包非常多,log4j、log4j2、commons-logging、logback、slf4j 等,本文首先梳理这些包之间关系,然后介绍在 spring boot 中日志的配置,最后介绍多环境的配置。
1 日志框架历史
1.1 log4j
很多年前,一个叫 Ceki Gülcü
的大佬在一个项目中开发跟踪 API,这套跟踪 API 逐步演变成 log4j
, 大概1999年, log4j
成为 Apache 的一员。
1.2 JUL
JUL:java.util.logging.
Apache 觉得 log4j 很有价值,就推荐给 SUN 公司(Java 语言是由 SUN 公司的 James Gosling 发明的),希望 SUN 公司在 JDK 中加入 log4j,SUN 公司觉得加入日志 API 很有必要,但是又看不上 log4j,于是便自己搞了一套官方的,于 2002 年 JDK 1.4 中实现了 JUL
。
此时,市面上就有两套日志 API:来自 Apache 的 log4j
和来自官方的 JUL
。
1.3 JCL(Jakarta Commons Logging)和 Simple Log
JCL:Jakarta Commons Logging.
log4j
和 JUL
是两套不同的 API。一个出现较早、一个是官方的,两个用户群体都较大。如果在项目中想要切换日志框架就需要改动大量代码,同时这也不符合”面向接口编程“的设计原则。Apache 就推出了 JCL 项目,名字看着高大上,但这玩意儿就是在 SSH、SSM 时代到处都能看见,那就是搭建框架时经常会看到的 commons-logging
包,该项目是一套日志的抽象层(后来大神们针对这种日志的抽象层一个高端的名字—— 日志门面 )。所谓”抽象层“,本质上就是一堆接口,有接口就需要有实现,没有实现那就是自娱自乐,没有鸟用。所以 Apache 针对 JCL 提供了一个默认实现,那就是 Simple Log
。
JCL 基于 动态绑定 来实现日志的记录:开发过程中使用 JCL 定义的接口,程序运行的时候使用类路径 classpath 中的具体实现(Simple Log、log4j、JUL)。
可以和 JDBC 类比,Java 官方制定了数据库访问层持久化操作的标准 JDBC,各个数据库厂商(Oracle、MySQL等)实现这套标准。JCL 也是想成为规范制定者,统一日志操作的规范。
JCL 的出现,日志体系显得比较优雅,面向 JCL 的接口编程,可以很方便的切换日志框架。在这个时候, log4j他爹
Ceki`因为一些未知的原因离开了 Apache。
1.4 slf4j
slf4j:Simple Logging Facade for Java.
写代码的人大多有个共性:别人写的都是垃圾、自己昨天写的代码也是垃圾,只有自己现在写的才是最好的。 Ceki
这哥们同样觉得 JCL 不是特别完美,于是自己又搞了一套新版本的日志接口(高端的名字是:日志门面):slf4j。
问题来了,slf4j 只有接口没有实现,难不成要让 log4j 和 JUL 都来实现 slf4j 吗ÿ