企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 一、日志框架简介 Spring Boot 默认的日志记录框架使用的是 Logback,此外我们还可以选择 Log4j 和 Log4j2。其中 Log4j 可以认为是一个过时的函数库,已经停止更新,不推荐使用,相比之下,性能和功能也是最差的。logback 虽然是 Spring Boot 默认的,但性能上还是不及 Log4j2,因此,在现阶段,日志记录首选 Log4j2。 ![](https://box.kancloud.cn/ef1a0347b2282a671fd0b95f060f62b3_685x363.png) 当然,在实际项目开发中,我们不会直接调用上面三款日志框架的 API 去记录日志,因为这样如果要切换日志框架的话代码需要修改的地方太多。因此,最佳实践是采用 SLF4J 来进行日志记录,SLF4J 是基于门面模式实现的一个通用日志框架,它本身并没有日志记录的功能,实际的日志记录还是需要依赖 Log4j、logback 或者 Log4j2。使用 SLF4J,可以实现简单快速地替换底层的日志框架而不会导致业务代码需要做相应的修改。SLF4J + Log4j2 是我们推荐的日志记录选型。 在使用 SLF4J 进行日志记录时,通常都需要在每个需要记录日志的类中定义 Logger 变量,如下所示: ~~~ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @RestController public class SmsController { private static final Logger LOGGER = LoggerFactory.getLogger(SmsController.class); ... } ~~~ 这显然属于重复性劳动,降低了开发效率,如果你在项目中引入了 Lombok,那么可以使用它提供的 @Slf4j 注解来自动生成上面那个变量,默认的变量名是 log,如果我们想采用惯用的 LOGGER 变量名,那么可以在工程的 main/java 目录中增加 lombok.config 文件,并在文件中增加 lombok.log.fieldName=LOGGER 的配置项即可。 ## 二、日志级别 细说各日志框架整合配置前,我们先来大致了解下,最常见的日志的几个级别:ERROR, WARN, INFO, DEBUG和TRACE。像其他的,比如ALL、OFF和FATAL之类的开发过程中应该基本上是不会涉及的。所以以下从低到高一次介绍下常见的日志级别。 1. TRACE:追踪。一般上对核心系统进行性能调试或者跟踪问题时有用,此级别很低,一般上是不开启的,开启后日志会很快就打满磁盘的。 2. DEBUG:调试。这个大家应该不陌生了。开发过程中主要是打印记录一些运行信息之类的。 3. INFO:信息。这个是最常见的了,大部分默认就是这个级别的日志。一般上记录了一些交互信息,一些请求参数等等。可方便定位问题,或者还原现场环境的时候使用。此日志相对来说是比较重要的。 4. WARN:警告。这个一般上是记录潜在的可能会引发错误的信息。比如启动时,某某配置文件不存在或者某个参数未设置之类的。 5. ERROR:错误。这个也是比较常见的,一般上是在捕获异常时输出,虽然发生了错误,但不影响系统的正常运行。但可能会导致系统出错或是宕机等。 ## 三、常见术语概念解析 1. appender:主要控制日志输出到哪里,比如:文件、数据库、控制台打印等 2. logger: 用来设置某一个包或者具体某一个类的日志打印级别、以及指定appender 3. root:也是一个logger,是一个特殊的logger。所有的logger最终都会将输出流交给root,除非设置logger中配置了additivity="false"。 4. rollingPolicy:所有日志都放在一个文件是不好的,所以可以指定滚动策略,按照一定周期或文件大小切割存放日志文件。 5. RolloverStrategy:日志清理策略。通常是指日志保留的时间。 6. 异步日志:单独开一个线程做日志的写操作,达到不阻塞主线程的目的 ## 四、性能测试结果 ![](https://box.kancloud.cn/2387ee5e9f33cb9ee2415146308df401_757x398.png) 参考:[log4j2官网](http://logging.apache.org/log4j/2.x/manual/async.html)