SpringBoot日志操作

发布于 2022-11-12  3.6k 次阅读


1. SpringBoot日志依赖关系

SpringBoot为了方便日志的整合使用提供两个不同的日志场景启动器:

  1. spring-boot-starter-logging(默认):使用slf4j+logback
  2. spring-boot-starter-log4j2:使用slf4j+log4j2

SpringBoot默认采用slf4j+logback的组合形式,springBoot也提供了对JUL、Log4j、Logback提供了默认配置

SpringBoot日志配置有两种方式:

  • 使用SpringBoot配置文件配置日志
  • 单独新建配置文件进行配置,这个配置文件命名要根据具体使用的日志框架实现(logback使用logback.xml,log4j2使用log4j2.xml)

1)默认导入spring-boot-starter-web依赖就默认引入spring-boot-starter-logging:

2)spring-boot-starter-logging的依赖关系

  • 默认底层实现是Logback
  • 可以使用JUL和log4j的API,通过桥接器让Logback做具体实现

2. SpringBoot的日志配置

2.1 日志级别的配置

日志级别的两种不同设置:

1)rootLogger日志级别的设置:因为rootLogger是根Logger(继承关系),因此它的修改是全局生效的

logging:
  level:
    root: 日志级别

2)自定义Logger日志级别的设置:SpringBoot使用组的概念设置自定义Logger

logging:
  group:
    自定义Logger名称: 包路径或类路径
  level:
   自定义Logger名称: 日志级别

默认logback五种日志级别:

  1. trace
  2. debug
  3. info
  4. warn
  5. error

例:

① 配置文件

logging:
  group:
    mylogback: com.kxjlog
  level:
    root: info
    mylogback: trace

② 测试

@Test
void contextLoads() {
    Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);

    logger.trace("trace信息");
    logger.debug("debug信息");
    logger.info("info信息");
    logger.warn("warn信息");
    logger.error("error信息");

}

③ 输出

2022-11-11 21:48:04.077 TRACE 16520 --- [           main] c.k.s.SpringbootlogApplicationTests      : trace信息
2022-11-11 21:48:04.077 DEBUG 16520 --- [           main] c.k.s.SpringbootlogApplicationTests      : debug信息
2022-11-11 21:48:04.077  INFO 16520 --- [           main] c.k.s.SpringbootlogApplicationTests      : info信息
2022-11-11 21:48:04.077  WARN 16520 --- [           main] c.k.s.SpringbootlogApplicationTests      : warn信息
2022-11-11 21:48:04.077 ERROR 16520 --- [           main] c.k.s.SpringbootlogApplicationTests      : error信息

2.2 日志格式的配置

SpringBoot默认日志输出格式:

2022-11-11 21:48:04.077 TRACE 16520 --- [           main] c.k.s.SpringbootlogApplicationTests      : trace信息

按照输出顺序分别是:

  1. 日期和时间:毫秒精度,易于排序
  2. 日志级别:trace,debug,info,warn,error
  3. 进程ID标识
  4. --- :用于分隔
  5. 线程名称:括在括号内
  6. 记录器名称
  7. 日志内容

1)日志格式配置信息:

  • %d或%date:指定日志的日期。默认是ISO8601的标准日期,默认为yyyy-MM-dd HH:mm:ss:SSS
  • %level:指定日志的级别:trace<debug<info<warn<error
  • %logger:指定日志输出的包名+类名,{n}可以限定长度 比如:%logger{50}
  • %M:指定日志发生时的方法名
  • %L:指定日志调用的所在的行,线下运行的时候不建议使用此参数,因为获取代码的行号对性能有损耗
  • %m(或%msg):标识日志输出的内容
  • %n:日志是否换行
  • %thread:打印线程名称

2)彩色编码输出

    如果终端支持ANSI,则可以使用颜色输出来提供可读性,可以设置spring.output.ansi.enabled为支持的值以覆盖自动检测

    使用%clr转换字配置颜色编码,在最简单的形式中,转换器会根据日志级别为输出着色

等级 颜色
FATAL 红色
ERROR 红色
WARN 黄色
INFO 绿色
DEBUG 绿色
TRACE 绿色

可以通过将其作为转换选项提供来指定应用颜色或样式,例如:要使文本变黄,可以如下设置

%clr(%d{yyyy-MM-dd HH:mm:ss}){yellow}

支持颜色环如下:

blue cyan faint green magenta red tellow ……

例:

logging:
  pattern:
    console: "%d %clr(%p){cyan} -- %clr([%16t]){blue} %clr([%m]){green} %n"

2.3 日志输出的配置 

默认日志是输出到控制台中,但对于项目的后期维护就必须把日志进行持久化存储,为此需要进行输出配置

对于日志文件的使用有很多策略,如:每日记录、分类记录、报警记录等,主要演示如何配置

1)将日志输出到文件

logging:
  group:
    mylogback: com.kxjlog
  level:
    mylogback: trace
  file: #输出文件配置项
    name: stringbootlog.log #文件路径和名称

2)将文件进行拆分

logging:
  group:
    mylogback: com.kxjlog
  level:
    mylogback: trace
  file:
    name: stringbootlog.log
  logback:
    rollingpolicy:
      max-file-size: 2KB
      file-name-pattern: bootserver.%d{yyyy-MM-dd}.%i.log
      max-history: 7
  • rollingpolicy:文件拆分
  • max-file-size:指定文件的最大存储量,超过了就进行拆分
  • file-name-pattern:拆分后的文件命名,%i表示序列从1开始递增
  • max-history:最大日志文件拆分数量,默认为7,当拆分到7个时就对最开始的文件进行内容覆盖

3.SpringBoot替换日志框架

SpringBoot提供了两个日志场景启动器,在Log4j2和Logback之间只能二选一,默认使用的logback

替换为log4j2的pom配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!--排除默认的logging-->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

测试:

@Test
void contextLoads() {
    Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);

        logger.trace("trace信息");
        logger.debug("debug信息");
        logger.info("info信息");
        logger.warn("warn信息");
        logger.error("error信息");
        
}

输出:

2022-11-12 00:00:23.489 TRACE 1660 --- [           main] c.k.s.SpringbootlogApplicationTests      : trace信息
2022-11-12 00:00:23.489 DEBUG 1660 --- [           main] c.k.s.SpringbootlogApplicationTests      : debug信息
2022-11-12 00:00:23.489  INFO 1660 --- [           main] c.k.s.SpringbootlogApplicationTests      : info信息
2022-11-12 00:00:23.489  WARN 1660 --- [           main] c.k.s.SpringbootlogApplicationTests      : warn信息
2022-11-12 00:00:23.489 ERROR 1660 --- [           main] c.k.s.SpringbootlogApplicationTests      : error信息

4. SpringBoot指定配置文件

在一些复杂的日志场景,SpringBoot内部配置文件的配置往往有局限性,这个时候需要自己写配置文件

对于这个问题SpringBoot提供了解决方法:只要给resource类路径下放每个日志框架自己的配置文件即可;springBoot就会读取这些配置来实现日志配置

配置文件名称必须是系统指定:文件名如下

日志框架 配置文件名
logback logback-spring.xml,logback-spring.groovy,logback.xml,logback.groovy
log4j2 log4j2-spring.xml,log4j2.xml
JUL logging.properties

例:

① logback.xml

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

    <!--通用配置项,文件地址-->
    <property name="file" value="D://logback"></property>

    <!--配置fileappender文件输出-->
    <appender name="fileappender" class="ch.qos.logback.core.FileAppender">
        <!--指定文件输出地址-->
        <file>${file}/logback.log</file>
        <!--是否进行追加 默认为true-->
        <append>true</append>
        <!--配置格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--配置layout格式-->
            <pattern>%d{yyyy-MM-dd:HH:mm:ss.SSS} [%thread] %-5level  %msg%n</pattern>
        </encoder>
    </appender>

    <!--配置root根节点-->
    <root level="info">
        <!--引入appender-->
        <appender-ref ref="fileappender"/>
    </root>
</configuration>

输出:

5. Lombok简化日志操作

在通用的日志操作中需要手动获取Logger对象才能进行操作:

Logger logger = LoggerFactory.getLogger(XXX.class);

Lombok通过@Slf4j注解可以简化操作:

① 导入lombok依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>

② 简单使用

@SpringBootTest//测试类
@Slf4j
class SpringbootlogApplicationTests {

    @Test
    void test(){
        log.trace("trace信息");
        log.debug("debug信息");
        log.info("info信息");
        log.warn("warn信息");
        log.error("error信息");
    }
}

③ 输出

2022-11-12 00:06:14.458 TRACE 10192 --- [           main] c.k.s.SpringbootlogApplicationTests      : trace信息
2022-11-12 00:06:14.458 DEBUG 10192 --- [           main] c.k.s.SpringbootlogApplicationTests      : debug信息
2022-11-12 00:06:14.458  INFO 10192 --- [           main] c.k.s.SpringbootlogApplicationTests      : info信息
2022-11-12 00:06:14.458  WARN 10192 --- [           main] c.k.s.SpringbootlogApplicationTests      : warn信息
2022-11-12 00:06:14.458 ERROR 10192 --- [           main] c.k.s.SpringbootlogApplicationTests      : error信息

路漫漫其修远兮,吾将上下而求索