之前录过一个视频和大家分享 Spring Boot 日志问题,但是总感觉差点意思,因此松哥打算再通过一篇文章来和大家捋一捋 Java 中的日志问题,顺便我们把 Spring Boot 中的日志问题也说清楚。
1. Java 日志概览
说到 Java 日志,很多初学者可能都比较懵,因为这里涉及到太多东西了:Apache Commons Logging
、Slf4j
、Log4j
、Log4j2
、Logback
、Java Util Logging
等等,这些框架各自有什么作用?他们之间有什么区别?
1.1 总体概览
下面这张图很好的展示了 Java 中的日志体系:
可以看到,Java 中的日志框架主要分为两大类:日志门面和日志实现。
日志门面
日志门面定义了一组日志的接口规范,它并不提供底层具体的实现逻辑。Apache Commons Logging
和 Slf4j
就属于这一类。
日志实现
日志实现则是日志具体的实现,包括日志级别控制、日志打印格式、日志输出形式(输出到数据库、输出到文件、输出到控制台等)。Log4j
、Log4j2
、Logback
以及 Java Util Logging
则属于这一类。
将日志门面和日志实现分离其实是一种典型的门面模式,这种方式可以让具体业务在不同的日志实现框架之间自由切换,而不需要改动任何代码,开发者只需要掌握日志门面的 API 即可。
日志门面是不能单独使用的,它必须和一种具体的日志实现框架相结合使用。
那么日志框架是否可以单独使用呢?
技术上来说当然没问题,但是我们一般不会这样做,因为这样做可维护性很差,而且后期扩展不易。例如 A 开发了一个工具包使用 Log4j 打印日志,B 引用了这个工具包,但是 B 喜欢使用 Logback 打印日志,此时就会出现一个业务使用两个甚至多个日志框架,开发者也需要维护多个日志的配置文件。因此我们都是用日志门面打印日志。
1.2 日志级别
使用日志级别的好处在于,调整级别,就可以屏蔽掉很多调试相关的日志输出。不同的日志实现定义的日志级别不太一样,不过也都大同小异。
Java Util Logging
Java Util Logging
定义了 7 个日志级别,从严重到普通依次是:
-
SEVERE
-
WARNING
-
INFO
-
CONFIG
-
FINE
-
FINER
-
FINEST
因为默认级别是 INFO,因此 INFO 级别以下的日志,不会被打印出来。
Log4j
Log4j
定义了 8 个日志级别(除去 OFF 和 ALL,可以说分为 6 个级别),从严重到普通依次是:
-
OFF:最高等级的,用于关闭所有日志记录。
-
FATAL:重大错误,这种级别可以直接停止程序了。
-
ERROR:打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
-
WARN:警告提示。
-
INFO:用于生产环境中输出程序运行的一些重要信息,不能滥用。
-
DEBUG:用于开发过程中打印一些运行信息。
-
TRACE
-
ALL 最低等级的,用于打开所有日志记录。
Logback
Logback
日志级别比较简单,从严重到普通依次是:
-
ERROR
-
WARN
-
INFO
-
DEBUG
-
TRACE
1.3 综合对比
Java Util Logging
系统在 JVM
启动时读取配置文件并完成初始化,一旦应用程序开始运行,就无法修改配置。另外,这种日志实现配置也不太方便,只能在 JVM
启动时传递参数,像下面这样:
-Djava.util.logging.config.file=<config-file-name>。
由于这些局限性,导致 Java Util Logging
并未广泛使用。
Log4j
虽然配置繁琐,但是一旦配置完成,使用起来就非常方便,只需要将相关的配置文件