时间:2022-11-21 08:26:21 | 栏目:JAVA代码 | 点击:次
刚刚接触到java log日志的同学可能会被各种日志框架吓到,包括各种日志框架之间的jar总是发生冲突,另很多小伙伴头疼不已。那我们本篇的内容就是将各种java 日志框架发展过程,以及他们之间的关系,以及如何选型来介绍给大家。

为什么不直接使用日志框架,而是搞出一个日志门面?
日志门面(SLF4J)主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架来实现,例如log4j和logback等。 对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j、log4j2、logback等),中间使用桥接器完成桥接。
前面介绍的几种日志框架,每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的增加应用程序代码对于日志框架的耦合性要求。有了SLF4J这个门面之后,程序员永远都是面向SLF4J编程,可以实现简单快速地替换底层的日志框架而不会导致业务代码需要做相应的修改。
在使用 SLF4J 进行日志记录时,通常都需要在每个需要记录日志的类中定义 Logger 变量,如下所示:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class LogTestController {
private static final Logger logger = LoggerFactory.getLogger(LogTestController.class);
@GetMapping("/test")
public void test(){
logger.trace("Trace 日志...");
logger.debug("Debug 日志...");
logger.info("Info 日志...");
logger.warn("Warn 日志...");
logger.error("Error 日志...");
}
}
这显然属于重复性劳动,降低了开发效率,如果你在项目中引入了 Lombok,那么可以使用它提供的 @Slf4j 注解来自动生成上面那个变量,默认的变量名是 log,如果我们想采用惯用的 LOGGER作为 变量名,那么可以在工程的根目录中增加 lombok.config 文件,并在文件中增加lombok.log.fieldName=LOGGER的配置项即可。
SLF4J + Log4j2 是我们推荐的日志记录选型。
性能测试结果

参考:log4j2官网
细说各日志框架整合配置前,我们先来大致了解下,最常见的日志的几个级别:ERROR, WARN, INFO, DEBUG和TRACE。像其他的,比如ALL、OFF和FATAL之类的开发过程中应该基本上是不会涉及的。所以以下从低到高一次介绍下常见的日志级别。
日志级别从小到大为trace<debug<info<warn<error<fatal,由于通常日志框架默认日志级别设置为INFO,因此1.3.小节中样例trace和debug级别的日志都看不到。
2020-08-17 13:59:16.566 INFO c.z.b.l.controller.LogTestController : Info 日志... 2020-08-17 13:59:16.566 WARN c.z.b.l.controller.LogTestController : Warn 日志... rn 日志... 2020-08-17 13:59:16.566 ERROR c.z.b.l.controller.LogTestController : Error 日志...
