我现在如何使用Java的日志

最近看到一些日志相关的文章,这里简单记录一下。

Java 日志的使用

SLF4J

Commons Logging 和 SLF4J

这俩都是日志接口,它是一个抽象层,日志接口需要挂接日志系统才行。之所以要这样设计是为了统一不同类库的日志系统,避免当项目引入一个类库的时候还需要加载和维护类库的日志系统。

SLF4J + Logback

  • SLF4J的API好于Commons Logging

  • Logback的性能好于Log4j

Logback 是 SLF4J 的好搭档,在SLF4J官网中被标记为了 NATIVE IMPLEMENTATION。当然 SLF4J 还支持其他日志系统,见下图:

concrete-bindings

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。

image-20211204203144146

基于此,其实现在可以直接用 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
2
3
public class A {
public static final Logger logger = LoggerFactory.getLogger(A.class);
}

每一个类写日志都得写上面这一行,有点麻烦,所以有些xd就用了一些奇技淫巧来封装。

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