最近看到一些日志相关的文章,这里简单记录一下。
Java 日志的使用
SLF4J
Commons Logging 和 SLF4J
这俩都是日志接口,它是一个抽象层,日志接口需要挂接日志系统才行。之所以要这样设计是为了统一不同类库的日志系统,避免当项目引入一个类库的时候还需要加载和维护类库的日志系统。
SLF4J + Logback
SLF4J的API好于Commons Logging
Logback的性能好于Log4j
Logback 是 SLF4J 的好搭档,在SLF4J官网中被标记为了 NATIVE IMPLEMENTATION。当然 SLF4J 还支持其他日志系统,见下图:
SLF4J + Log4j2
[pending]
参见:https://cloud.tencent.com/developer/article/1510640
SLF4J 自定义日志级别
因为有的时候一些框架会把一些调试信息放到[INFO]级别中,而用[WARN]级别总感觉像是在提示BUG,所以很希望自定义一个在 INFO 和 WARN 之间的 LOG 级别。
遗憾的是 SLF4J 不支持自定义日志级别,不过它有一个 Mark
,每个日志条目都可以为其建立一个“标记”,用这个标记可以做到类似的效果,将重要信息筛选出来。
MDC
[pending]
SLF4J 的坏处
使用像 SLF4J 这样的日志接口虽然带来了很大的灵活性,让我们的代码可以独立于任意一个特定的日志API,但是这其实是在使用不同日志系统的“共性” ,也就意味着我们的程序不能使用底层日志系统一些丰富的功能。
对于这一点,Log4j2 提出了一个解决方案,让程序兼容不同日志系统的同时能够使用 Log4j2 的特性。
Log4J2
Log4j是很多项目都在使用的日志系统,但是几年前已经停止维护了,现在应该用 Apache Log4j2来代替Log4j,Log4j2推出了很多改进,应该是目前性能最好的日志系统。
log4j-to-slf4j
Log4j2 提供了一个 log4j-to-slf4j
的桥接模块。任何程序不支持 Log4j2 的 API 的话可以选择兼容 slf4j。
基于此,其实现在可以直接用 Log4j2,可以不用 SLF4J 啦~
Log4j2 的特性
[pending]
Log4j2 自定义日志级别
Log4J 2 支持自定义日志级别。自定义日志级别可以在代码或配置中定义。要在代码中定义自定义日志级别,请使用 Level.forName()方法。此方法为指定名称创建一个新级别。定义日志级别后,可以通过调用 Logger.log()方法并传递自定义日志级别来在此级别记录消息。
直接见文档:https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-customloglevels.html
奇技淫巧
封装SLF4J/Log4j,不再处处定义logger变量
自从开始使用日志组件后, 每个类都是这样子的结构:
1 | public class A { |
每一个类写日志都得写上面这一行,有点麻烦,所以有些xd就用了一些奇技淫巧来封装。
- 实现1:https://segmentfault.com/a/1190000007214708
- 实现2:https://blog.csdn.net/lkmgydx/article/details/89524832
Lombok
这种方式争议性较大,我也不推荐使用
参考
Can I add custom levels to SLF4J? - https://stackoverflow.com/questions/12201112/can-i-add-custom-levels-to-slf4j
Is it worth to use slf4j with log4j2 - https://stackoverflow.com/questions/41498021/is-it-worth-to-use-slf4j-with-log4j2
使用SLF4J和Logback - https://www.liaoxuefeng.com/wiki/1252599548343744/1264739155914176
SLF4J user manual - http://www.slf4j.org/manual.html
Log4j2中文文档 - https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-customloglevels.html
封装SLF4J/Log4j,不再处处定义logger变量 - https://segmentfault.com/a/1190000007214708