• SpringBoot日志配置


    SpringBoot日志配置

    规范:项目开发不应该编写System.out.println()的语句,而应该日志记录信息。

    日志门面技术日志实现
    JCL(Jakarta Commons Logging)Log4j、 JUL(java.util.logging)
    SLF4j(Simple Logging Facade for Java)Log4j2、Logback
    jboss-logging

    简介

    1、Spring使用commons-logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。
    spring5及以后commons-logging被spring自动导入
    2、支持jul, log4j2, logback。SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件。
    3、logback是默认使用的
    4、虽然日志框架很多,但我们可以使用SpringBoot的默认配置。

    SpringBoot默认日志配置

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

    日志格式

    在这里插入图片描述

    默认输出格式

    时间和日期:毫秒级精度

    日志级别:ERROR、WARN、INFO、DEBUG、TRACE

    进程ID

    —:消息分割符

    线程名:使用[]包含

    Logger名:通常是产生日志的类别

    消息:日志记录的内容

    默认值可参照spring-bootadditional-spring-configuration-metadata.json文件。

    在这里插入图片描述

    注意:logback没有FATAL级别,对应的是ERROR,在控制台使用jps能够查看所有进程。

    日志使用

    方式一

    @RestController
    public class HelloController {
        Logger logger = LoggerFactory.getLogger(HelloController.class);
        //Logger logger = LoggerFactory.getLogger(getClass())
        @GetMapping("/hello")
        public String hello(){
            logger.info("test log");
            return "hello";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    在这里插入图片描述

    方式二

    @Slf4j
    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello(){
            log.info("need lombok dependency");
            return "hello";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    在这里插入图片描述

    日志级别

    由低到高:ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF
    只会打印指定级别及以上级别的日志

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

    不指定级别的所有类,都使用root指定的级别作为默认级别,SpringBoot日志默认级别是INFO。

    测试
    @Slf4j
    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello(){
            log.trace("trace 日志.....");
            log.debug("debug 日志.....");
            log.info("info 日志.....");
            log.warn("warn 日志.....");
            log.error("error 日志.....");
            return "hello";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    由于SpringBoot默认的日志级别是INFO,所以只有INFO级别及更高级别的日志信息才会被输出到日志中,而TRACE、DEBUG级别的日志信息将被忽略。

    日志配置

    1、在application.properties/yml中配置logging.level.=指定日志级别,logger-name可以是某一个类
    2、level可取值范围:TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF,定义在LogLevel中
    3、root的logger-nameroot,可以配置logging.level.root=warn,代表所有未指定日志级别都使用root的warn级别

    日志输出参数

    @Slf4j
    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello(String a, String b){
            log.info("info 日志.....参数a:{} b:{}",a, b);
            return "hello";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    日志分组

    将相关的logger分组在一起,统一配置。如:Tomcat相关的日志统一设置。

    在这里插入图片描述

    SpringBoot预定义两个开箱即用的组

    nameLoggers
    weborg.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.web.servlet.ServletContextInitializerBeans
    sqlorg.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

    文件输出

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

    logging.file.namelogging.file.path示例效果
    未指定未指定仅控制台输出
    指定未指定my.log写入指定文件。可以加路径
    未指定指定/var/log写入指定目录,文件名为spring.log
    指定指定logging.file.name为准
    #指定日志文件的路径,日志文件默认名叫spring.log
    #logging.file.path=
    #指定日志文件的名称
    #1、只写名字、就生成当前项目相同位置的demo.log
    #logging.file.name=demo.log
    #2、写名字+路径:生成到指定位置的指定文件
    logging.file.name=D://demo.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    当path配置项和name配置项同时存在的时候,以name为准。

    文件归档与滚动切割

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

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

    配置项描述
    logging.logback.rollingpolicy.file-name-pattern日志存档的文件名格式(默认值:$(LOG_FILE).%d(yyyy-MM-dd).%i.gz)
    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)
    logging.logback.rollingpolicy.file-name-pattern=$(LOG_FILE).%d(yyyy-MM-dd).%i.gz)
    
    • 1
    自定义配置

    通常我们配置application.properties就够平常使用,当然也可以自定义。如:

    日志系统自定义
    Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
    Log4j2log4j2-spring.xml,log4j2.xml
    JDK(Java Util Logging)logging.properties

    建议在日志配置文件中使用-spring变量,而不是xxx.xml,如果不加-springspring不能完全控制。

    切换日志组合

    使用maven的就近原则。

    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starterartifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-loggingartifactId>
        exclusion>
    exclusions>
    dependency>
    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-log4j2artifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    最佳应用场景

    1、导入热更新(Hot Reload)和第三方框架后,由于Spring Boot底层已经管理好了日志,因此需要排除这些框架的日志包。
    2、修改application.properties配置文件,调整日志的所有行为。如果不够,可以编写日志框架,自己的配置文件放在类路径下就行,比如logback-spring.xml, log4j2-spring.xml
    3、如果需要对接专业日志系统,只需要把logback记录的日志灌倒kafka中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可
    4、业务中使用slf4j-api记录日志。不再需要System.out.pritln()

  • 相关阅读:
    java设计模式之装饰者模式
    【QT】QT自定义C++类
    已解决!Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.8.1
    foxmail群发邮件怎么发?
    LQ0241 身份证号校验【程序填空】
    矿用升降台驱动电机调速控制系统建模与仿真
    d为何用模板参数
    【数据结构与算法】手撕平衡二叉树
    IT运营与DevOps:有何不同?
    Java实现拼图小游戏
  • 原文地址:https://blog.csdn.net/xry12354/article/details/132818404