Spring|Spring Boot之整合logback日志

前言
本文使用的项目代码,是基于之前文章使用的Spring Boot项目:
  • Spring Boot数据库交互之Mybatis
  • Spring Boot之整合Swagger
日志系统分为两部分,一部分是日志抽象层,一部分是日志实现层。
常见日志抽象层:
  • JCL
  • SLF4J
  • JBoss-Logging
常见日志实现层有:
  • logback
  • log4j
  • log4j2
  • JUL
每种Logger都可以通过配置使用控制台或者文件输出日志内容,logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持slf4j,而Spring Boot 默认使用slf4j + logback作为日志系统,广泛应用于Spring Boot项目。今天我们就一起来学学如何使用slf4j + logback日志系统。
整合logback日志步骤
1. 添加依赖?
2. 创建日志配置文件;
3. 编写日志配置文件;
4. 日志配置文件介绍;
5. 日志实例;
6. 日志效果。
1. 添加依赖?
如果要使用logback,原则上是需要添加dependency依赖的,但也如前言所说,logback是Spring Boot 默认的日志实现层,因此只要项目中只要有使用了spring-boot-starter或者spring-boot-starter-web依赖,默认已经包含logback的相关依赖:
#无需再次引用以下logback依赖: org.springframework.boot spring-boot-starter-logging

2. 创建日志配置文件;
在项目src/main/resources底下创建日志配置文件,如:logback-spring.xml;
注意:能够被Spring Boot自动识别的logback日志配置文件名:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy。 如果换成其他名字,如logging-config.xml,那么需要在application.properties文件内额外指定文件名,如:
logging.config=classpath:logging-config.xml

官方推荐优先使用带有“-spring”文件名的文件作为日志配置文件,这样Spring Boot会为它添加一些Spring Boot特有的配置项。 Spring|Spring Boot之整合logback日志
文章图片
logback日志配置文件
3. 编写日志配置文件;
logback INFO true %red([%d{yyyy-MM-dd HH:mm:ss}]) %green([ %thread ]) %highlight([ %-5level ]) %boldMagenta([ %logger ]) - %cyan(%msg%n) GBK ${LOG_PATH}/current.log ${LOG_ARCHIVE}/app.%d.%i.log.gz 30 20GB 10MB [%d{yyyy-MM-dd HH:mm:ss}] [ %thread ] [ %-5level ] [ %logger ] - %msg%n GBKM

4. 日志配置文件介绍;
1. 节点:
用于定义变量,方便使用。有两个属性:name,value。有两个属性:name、value,定义变量后,可以使用${}来使用变量,如:
  • 声明变量:

  • 使用变量:
${LOG_PATH}/current.log ... ${LOG_ARCHIVE}/app.%d.%i.log.gz

2. 节点:
用来格式化日志输出的节点,有两个属性: name、class,name用于给该 appender 命名,class用于指定输出策略,通常有两种:
  • 控制台输出:
...

  • 文件输出:
...

3. 子节点:
日志过滤器或叫过滤策略,在此之前,我们需要先了解一些基础知识:
过滤器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一个:
  • 如果返回DENY,那么记录事件立即被抛弃,不再经过剩余过滤器;
  • 如果返回NEUTRAL,那么有序列表里的下一个过滤器会接着处理记录事件,下一个过滤器会继续执行过滤,如无其他过滤器,则记录日志;
  • 如果返回ACCEPT,那么记录事件被立即处理,不再经过剩余过滤器。
日志级别由低到高: trace < debug < info < warm < error
常见过滤策略有:
  • ThresholdFilter: 临界值过滤器。
过滤掉低于指定临界值的日志,当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝,即不记录。
例如,过滤掉所有低于INFO级别的日志:
INFO

  • LevelFilter:级别过滤器。
根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。
例如,当且仅当日志级别为ERROR时记录日志,否则不记录:
ERROR ACCEPT DENY

  • EvaluatorFilter:求值过滤器。
求值过滤器,评估、鉴别日志是否符合指定条件。需要额外的两个JAR包,commons-compiler.jar和janino.jar,我也没有尝试,此处不做介绍。
4. 子节点:
用于设置日志格式化策略、字体等。
5. 子节点:
用于设置滚动策略,所谓的滚动,即自动停止在当前日志文件中打印日志,同时自动启用新的日志文件进行记录,我们可以设置一定的策略,使得这样的过程在满足该策略条件时,自动发生滚动操作。
最常用的滚动策略是TimeBasedRollingPolicy,它根据时间来制定滚动策略,如:
# 日志最多保留30天,且总保存量为20GB; # 当文件达到10MB时,会进行压缩和切割滚; # 旧log以${log.path}/app.%d.%i.log.gz文件路径滚动,如:logs/app.2020-08-10.0.log.gz,app.2020-08-10.1.log.gz; # 新生成的日志文件一直还是logs/current.log。${LOG_PATH}/current.log${LOG_ARCHIVE}/app.%d.%i.log.gz 30 20GB 10MB

滚动实例如: Spring|Spring Boot之整合logback日志
文章图片
滚动实例 6. 节点:
root节点是必选节点,用来指定最基础的日志输出级别,如:
#低于warn(大小写均可)级别的日志,将不被记录。

7. 节点:
【Spring|Spring Boot之整合logback日志】logger节点用于单独对某个类进行日志策略定制,如:
#对于com.mycompany.sample.service.LeadService类,最低纪录日志界别为warn,记录类型为文件型,低于warn级别的日志将不被记录。

5. 日志实例;
  • 实例1:
package com.mycompany.sample; import org.mybatis.spring.annotation.MapperScan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import springfox.documentation.swagger2.annotations.EnableSwagger2; /** * @author : dylanz * @since : 07/07/2020 **/ @SpringBootApplication @EnableSwagger2 @MapperScan(basePackages = "com.mycompany.sample.dao") public class App { private static Logger logger = LoggerFactory.getLogger(App.class); public static void main(String[] args) { SpringApplication.run(App.class, args); logger.trace("This is trace logger..."); logger.debug("This is debug logger..."); logger.info("This is info logger..."); logger.warn("This is warn logger..."); logger.error("This is error logger..."); } } //关键一行代码: //private static Logger logger = LoggerFactory.getLogger(App.class); //getLogger()方法内要使用该类类名;

  • 实例2:
package com.mycompany.sample.service; import com.mycompany.sample.dao.LeadDAO; import com.mycompany.sample.domain.Lead; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author : dylanz * @since : 07/07/2020 **/ @Service public class LeadService { private static Logger logger = LoggerFactory.getLogger(LeadService.class); @Autowired private LeadDAO leadDAO; public Lead getLeadByLeadId(Long leadId) { logger.trace("This is trace logger in LeadService..."); logger.debug("This is debug logger in LeadService..."); logger.info("This is info logger in LeadService..."); logger.warn("This is warn logger in LeadService..."); logger.error("This is error logger in LeadService..."); return leadDAO.getLeadByLeadId(leadId); } }

6. 日志效果;
  • console日志;
  • file日志;
Spring|Spring Boot之整合logback日志
文章图片
日志
码字不容易,点赞需积极 谢谢!!!

    推荐阅读