在众多的 Java 日志工具中,Log4j 是最先被广泛使用的,目前流行的是带有 Logback 的 SLF4J。开发人员有时需要将一些组件封装到应用程序中,因此无法保证所有组件都使用指定的日志记录工具。此外,应用程序可能会使用许多使用不同日志记录工具的第三方包。例如,如果应用程序有两个使用不同日志记录工具的组件,则应用程序将同时从两个日志记录工具输出日志,从而导致日志记录变得复杂。
- 作为一个大而全的工具库,Hutool自然也有自己的日志门面,功能类似于Slf4j。既然像Slf4j这种门面框架已经非常完善,为何还要自己做一个门面呢?
- log对象创建比较复杂
很多时候我们为了在类中加日志不得不写一行,而且还要去手动改XXX这个类名
private static final Logger log = LoggerFactory.getLogger(XXX.class);
- 对于附带Exception参数的方法,并不支持变量。
Slf4j中的形式,这样既省去了麻烦的isInfoEnabled()的判断,还避免了拼接字符串:
log.info("我在XXX 改了 {} 变量", "name");
但是这种情况下就无法使用变量模式:
log.error("错误消息", e);
- 因此,Hutool-log被设计成具有如下特点的日志门面:
- Logfactory.get方法不再需要(或者不是必须)传入当前类名,会自动解析当前类名
- log.xxx方法在传入Exception时同时支持模板语法。
- 不需要桥接包而自动适配引入的日志框架,在无日志框架下依旧可以完美适配JDK Logging。
- 引入多个日志框架情况下,可以自定义日志框架输出。
Hutool-log采用动态自动适配模式,它会自动检测引入的日志框架包从而将日志输出到此框架。 比如我们在项目中引入Log4j的包,Hutool-log会自动检测到此包的存在,并将日志输出到log4j。如果没有引入任何日志框架,会将日志输出到JDK Logging中。
因此,Hutool-log并没有统一的配置文件,如果你引入任何一种日志框架,使用此框架的配置文件即可。
Hutool-log对于日志框架的监测顺序是: Slf4j(Logback) > Log4j > Log4j2 > Apache Commons Logging > JDK Logging > Console
当然,如果只是引入Slf4j-API,而没有引入任何实现,Slf4j将被跳过。
- 但是个人认为Hutool-log的日志等级仍然存在缺失,作为一个通用的日志门面,日志的等级应该足够的全,才能够满足对各日志系统的覆盖。
JUL中的Config等级以及Fatal等级是很有必要被引入设计中的。
CONFIG级别用于记录有关系统配置和参数的信息。它通常用于记录应用程序启动时的配置信息,例如数据库连接信息、环境变量、配置文件的加载等。这些信息对于调试和排除问题非常有帮助,它们提供了应用程序运行时的关键设置和环境细节。可以在需要时启用或禁用CONFIG级别的日志记录,从而获取程序的运行时信息。
FATAL是最高级别的日志级别,用于记录严重的错误和异常情况。当应用程序遇到无法继续执行的错误时,FATAL级别的日志信息通常包含异常堆栈跟踪,以帮助开发人员确定问题的根本原因。级别的日志记录是必要的。这些错误可能会导致应用程序崩溃或无法正常工作,因此需要尽快发现和处理。
同时Hutool-log并不需要担心受到Slf4j漏洞的影响(当然也包括其他日志框架)
Hutool并不直接依赖对应的日志框架,而只是在编译的时候需要,并不会保有存在漏洞的代码,只有在实际运行中引入了相关版本的Slf4j,才会导致出现问题。然而此时的关键问题似乎变成了被引入的日志库的了。