欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

springboot日志级别选择,springboot设置日志输出到控制台

墨初 知识笔记 126阅读

[toc](目录)

> SpringBoot3需要jdk17

# 1. 简介

1. Spring5及以后Spring自己实现了commons-logging来作为内部的日志。日志的jar包是org.springframework:spring-jcl:6.0.10。查看org.apache.commons.logging.LogAdapter
Java
package org.apache.commons.logging;
......省略部分......
final class LogAdapter {
    private static final boolean log4jSpiPresent isPresent(org.apache.logging.log4j.spi.ExtendedLogger);
    private static final boolean log4jSlf4jProviderPresent isPresent(org.apache.logging.slf4j.SLF4JProvider);
    private static final boolean slf4jSpiPresent isPresent(org.slf4j.spi.LocationAwareLogger);
    private static final boolean slf4jApiPresent isPresent(org.slf4j.Logger);
    private static final Function<String, Log> createLog;
......省略部分......

只要导入了哪些日志包就会使用哪些日志实现框架。所以底层的日志是开放的可对接其他日志框架

2. 支持 jul、log4j2、logback(默认)日志实现。SpringBoot 提供了默认的控制台输出配置也可以配置输出为文件


# 2. SpringBoot日志默认配置流程
1、每个starter场景都会导入一个核心场景spring-boot-starter
2、核心场景引入了日志的所用功能spring-boot-starter-logging
3、spring-boot-starter-logging默认使用了logback slf4j 组合作为默认底层日志
4、日志是系统一启动就要用xxxAutoConfiguration是系统启动好了以后放好的组件后来用的
5、查看autoconfiguration的logging目录可以看到日志是利用监听器机制配置好的
6、日志所有的配置都可以通过修改配置文件实现。是以logging开始的所有配置


# 3. 默认日志格式

......省略部分......
2023-07-13T05:06:01.86608:00  INFO 3096 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path
2023-07-13T05:06:01.88108:00  INFO 3096 --- [           main] c.h.s.SpringBoot3TestApplication         : Started SpringBoot3TestApplication in 3.383 seconds (process running for 4.406)

默认输出格式
- 时间和日期毫秒级精度
- 日志级别ERROR、WARN、INFO、DEBUG
- 进程ID
- --- 消息分割符
- 线程名 使用[]包含
- Logger名 通常是产生日志的类名
- 消息日志记录的内容

默认值参照org.springframework.boot:spring-boot:3.1.1的META-INF的additional-spring-configuration-metadata.json文件

    {
      name: logging.pattern.console,
      type: java.lang.String,
      description: Appender pattern for output to the console. Supported only with the default Logback setup.,
      sourceType: org.springframework.boot.context.logging.LoggingApplicationListener,
      defaultValue: %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-ddTHH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
    }

修改默认值如下

# 显示示例: 2023-07-13 05:16:09.952 INFO  [main] c.h.s.SpringBoot3TestApplication > Started SpringBoot3TestApplication in 2.305 seconds (process running for 3.107)
# logging.pattern.console%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} > %msg%n

# 只修改控制台输出的日期格式
logging.pattern.dateformatyyyy-MM-dd HH:mm:ss.SSS


# 4. 在类中记录日志
Java
package com.hh.springboot3test.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

Slf4j
RestController
public class ControllerTest {
    // Logger log LoggerFactory.getLogger(getClass());

    GetMapping(/hello)
    public String hello() {

        // 2023-07-13 05:24:15.659  INFO 10212 --- [nio-8080-exec-2] c.h.s.controller.ControllerTest          : 进入hello方法了
        log.info(进入hello方法了);
        return hello;
    }
}


# 5. 日志级别


由低到高ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF
- ALL打印所有日志
- TRACE追踪框架详细流程日志一般不使用
- DEBUG开发调试细节日志
- INFO关键、感兴趣信息日志
- WARN警告但不是错误的信息日志比如版本过时
- ERROR业务错误日志比如出现各种异常
- FATAL致命错误日志比如jvm系统崩溃
- OFF关闭所有日志记录

定义在org.springframework.boot:spring-boot:3.1.1的org.springframework.boot.logging.LogLevel枚举类

application.properties文件配置日志级别

# 默认日志级别设置
# logging.level.rootinfo
# 设置一个包或类的日志级别
logging.level.com.hh.springboot3test.controller.ControllerTestdebug


# 6. 日志分组
将相关的logger分组在一起统一配置。application.properties配置如下


# 多个值用逗号分隔
logging.group.my-logging-groupcom.hh.springboot3test.controller.ControllerTest
logging.level.my-logging-groupwarn

SpringBoot预定义两个组
- web: 包含org.springframework.core.codec、org.springframework.http、org.springframework.web、org.springframework.boot.actuate.endpoint.web、org.springframework.boot.web.servlet.ServletContextInitializerBeans
- sql: 包含org.springframework.jdbc.core、org.hibernate.SQL、org..tools.LoggerListener


# 7. 文件输出
SpringBoot默认只把日志写在控制台如果想额外记录到文件可以在application.properties中添加logging.file.name或logging.file.path配置项


logging.file.name | logging.file.path | 示例 | 效果
------ | ------ | ------ | ------
未指定 | 未指定 |  | 仅控制台输出
指定 | 未指定 | D:\\my.log | 写入指定文件。可以加路径默认路径是项目根路径
未指定 | 指定 | D:\\ | 写入指定目录文件名为spring.log
指定 | 指定 |  | logging.file.path无效以logging.file.name为准

# 8. 文件归档与滚动切割

> 生产环境可以配置按日志级别分类进行文件归档和滚动切割

归档每天的日志单独存到一个文档中
切割每个文件10MB超过大小切割成另外一个文件


1. 每天的日志应该独立分割出来存档。如果使用logbackSpringBoot默认整合可以通过application.properties/yaml文件指定日志滚动规则
2. 如果是其他日志系统需要自己在日志配置文件中进行配置添加log4j2.xml或log4j2-spring.xml
3. 默认支持的滚动规则设置如下

配置项 | 描述
------ | ------
logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式默认值${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz。需要开启日志文件输出。LOG_FILE就是日志输出的路径和名称
logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清除以前存档默认值false
logging.logback.rollingpolicy.max-file-size | 存档前每个日志文件的最大大小默认值10MB
logging.logback.rollingpolicy.total-size-cap | 日志文件被删除之前可以容纳的最大大小默认值0B即容纳无限大小。设置1GB则磁盘存储超过 1GB 日志后就会删除旧日志文件
logging.logback.rollingpolicy.max-history | 日志文件保存的最大天数(默认值7)

# 9. 自定义配置

日志系统 | 自定义
------ | ------
Logback| logback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy
Log4j2 | log4j2-spring.xml、log4j2.xml
JDK (Java Util Logging) | logging.properties

建议在日志配置文件中使用-spring变量例如使用logback-spring.xml而不是logback.xml。如果您使用标准配置文件日志初始化时的日志spring不能获取

比如可以使用logback-spring.xml文件进行配置。会和SpringBoot的logback配置混合起作用


# 10. 切换使用log4j2

直接在pom.xml添加依赖就可以了。但是不能使用文件归档与滚动切割需要在log4j2.xml中自己配置

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <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>

也可以使用log4j2-spring.xml文件进行配置。会和SpringBoot的log4j2配置混合起作用


# 11 实践

1. 导入任何第三方框架先排除它的日志包因为SpringBoot底层控制好了日志
2. 修改application.properties配置文件就可以调整日志的所有行为。如果不够可以编写日志框架自己的配置文件放在资源路径下就行比如logback-spring.xmllog4j2-spring.xml
3. 如需对接专业日志系统如把logback记录的日志灌倒kafka之类的中间件这和SpringBoot没关系都是日志框架自己的配置修改配置文件即可

标签:
声明:无特别说明,转载请标明本文来源!