一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
简介
官网地址
是一个优秀的日志门面框架,能对接多种日志实现框架,例如:logback、jul、log4j、reload4j。具有强大的已有日志兼容性与丰富的实现选择。不依赖任何特殊的类加载器机制。绑定在编译时都是硬连线的, 以使用一个且只有一个特定的日志框架。所以不要在类路径上绑定多个日志框架,只能绑定一个。logback是其最优绑定。
强大之处
丰富的选择
官方对SLF4J使用的底层日志实现框架的选择称为绑定,即:将SLF4J的接口与某个实现绑定到一起
使用SLF4J日志门面之后,日志实现框架的选择替换在开发,测试、投产阶段都极其方便,且目前主流的日志框架都在选择范围内。且替换方式都是替换jar包依赖即可,对程序可以做到零修改。
官方的简介图
但是这个图稍微翻版一下:
上图中logback不需要适配的原因是它默认就实现了SLF4J的API,所以能完美的与SLF4J门面绑定。
强大的兼容
这个在官网中称为桥接遗留API
在同一项目中,已存在与SLF4J不同的日志API时,我们又想保持这些API,现在又想使用SLF4J时。SLF4J官方提供了桥接方案,即:在不需要更改源代码的情况下,添加API对应的日志框架过渡依赖jar包即可。 来自官方的图:
上面图的意思大概是:
方便的迁移
SLF4J 迁移器
SLF4J提供一个迁移工具,能将Java源码中除SLF4J之外的API,迁移到SLF4J。不过有一些限制,可能迁移并不彻底,但是也能省去大部分的重复性的迁移工作。
迁移器是一个jar可执行文件,其启动命令示例:java -jar slf4j-migrator-2.0.0-alpha7.jar
但是注意:迁移是在原java文件上做修改,所以迁移之前一定要记得备份
迁移的限制分为一般限制(不论哪个日志框架API都会存在)与特定日志API的限制。
一般限制:
-
构建脚本文件的修改需要手动提前修改为SLF4J,比如maven的pom文件
-
仅能支持日志消息是String类型的消息,其余类型则需要重写toString()方法。
-
不支持 FATAL 级别。
需要手动转换。这个限制一般可忽略,因为通常很少有日志语句带有 FATAL 级别。
-
同一方法同一行声明了多个记录器时,只能成功转换一个。
LOG4J迁移限制
- NDC 语句保持原样
- 调用
PropertyConfigurator或DomConfigurator无法迁移,因为它们没有 SLF4J 等效项。
JUL 迁移限制
-
调用
fine()或finer()的finest()方法java.util.logging.Logger保持原样。鉴于
fine(),finer()orfinest()调用可以映射到 SLF4J 中的 trace() 或 debug() 调用,因此无法猜测用户想要如何映射这些调用。 -
所有匹配 ".severe(" 的字符串都被字符串 ".error(" 替换,无需任何上下文分析。类似地,所有匹配 ".warning(" 的字符串都被替换为 ".warn("。
由于匹配/替换操作不是上下文相关的,如果你的代码中包含名为“severe”或“warning”的方法,那么迁移结果会出现编译错误。幸运的是,此类错误应该很少见且易于识别。
-
类中定义的以下方法的调用
java.util.logging.Logger需要手动迁移:log,logp,logrb,entering,exiting.
jar包作用
jar包在使用时应还包含版本号,此处忽略版本号。
详情:
桥接遗留 API
用户手册
jcl-over-slf4j.jar:桥接遗留的jcl API到slf4j API
jul-to-slf4j.jar:桥接遗留的jul API到slf4j API
slf4j-jcl.jar:提供JCL绑定,记录日志时,用的是SLF4J的API,但是会委托给绑定的JCL实现来记录日志。
slf4j-jdk14.jar:SLF4J API绑定jul实现。
slf4j-log4j12.jar:SLF4J API绑定log4j实现。log4j 1.x 已在 2015 年和 2022 年宣布 EOL(停产),从 SLF4J 1.7.35 开始,_slf4j-log4j_模块在构建时自动重定向到 _slf4j-reload4j_模块。slf4j与reload4j的API相同。
slf4j-reload4j.jar:SLF4J API绑定reload4j实现。
slf4j-nop.jar:NOP的绑定/提供者,默默地丢弃所有日志记录。
slf4j-simple.jar:简单 实现的绑定/提供程序,它将所有事件输出到 System.err。只打印级别 INFO 和更高级别的消息。此绑定在小型应用程序的上下文中可能很有用。
logback-classic.jar(依赖 logback-core.jar):SLF4J的直接实现,属于logback的模块之一。
log4j-over-slf4j:桥接遗留的log4j API到slf4j API
jar包使用注意
委托死循环
log4j-over-slf4j.jar 和 slf4j-reload4j.jar 不能同时存在,log4j API与reload4j API相同,同时存在会相互委托,陷入无限死循环。
jul-to-slf4j.jar 和 slf4j-jdk14.jar 不能同时存在
jcl-over-slf4j.jar_不应与_slf4j-jcl.jar同时存在
使用
使用时类路径中应有且只有一个实现绑定。具体的还需要绑定其余框架才行。
引入SLF4J依赖
其余绑定的依赖暂不在此说明。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0-alpha7</version>
</dependency>
参考: SLF4J