zoukankan      html  css  js  c++  java
  • 功能:SpringBoot日志配置详情

    SpringBoot日志配置详情

    一、介绍

    在所有的项目中,日志是必不可少的,为了高效清晰的查找日志,可以配置日志输出的等级和格式。

    在配置后,可以自定义输出日志到指定目录,可以按照天数来分割日志,可以按照日志级别分割日志,可以按照大小来进行分割日志。

    输出的日志方式,可以说五花八门,但总有一款适合你的项目

    二、简单配置

    1、日志的级别

    关于日志的级别打印,需要搞清楚日志等级的优先级

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    @Slf4j
    @Component
    public class LoggerTask {
    
        @Scheduled(cron = "0/30 * * * * ?")
        public void logTask(){
            // 日志级别,由低到高,trace < debug < info < warn < error
            log.trace("TRACE");
            log.debug("DEBUG日志");
            log.info("INFO日志");
            log.warn("WARN日志");
            log.error("ERROR日志");
        }
        
    }
    

    在SpringBoot的yaml配置文件中,添加相关日志的配置文件

    # 日志配置
    logging:
        level:
            # 代表工程所有类的日志等级
            root: info
    

    以下是日志的打印,发现比info级别低的debug和trace级别的日志没有打印出来。

    在实际项目中,除了日志输出的规范,合理利用日志等级,也可以达到清晰日志的规范,排查问题会变得高效

    image-20210123164025295

    除了logging.level.root,还可以指定对应包和类的日志级别

    配置文件和测试代码

    # 日志配置
    logging:
     level:
         # 代表工程所有包的日志等级
         root: info
         # 指定包下的日志等级
         com.banmoon.spring_boot_logger.mapper: debug
    
    import com.banmoon.spring_boot_logger.mapper.UserMapper;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    @Slf4j
    @Component
    public class LoggerTask {
        
        @Autowired
        private UserMapper userMapper;
     
     /**
         * 定时去查询数据库表
         */
        @Scheduled(cron = "10 * * * * ?")
        public void dbDemonstration(){
            log.info("=====================");
            int count = userMapper.countByExample(null);
            log.info("用户条数:{}", count);
            log.info("=====================");
        }
        
    }
    

    image-20210125133637550

    2、日志的打印格式

    虽然springBoot的日志打印格式足够清晰明了,但它支持自定义打印格式,还是记录一波吧

    配置文件指定格式

    # 日志配置
    logging:
        pattern:
            # 格式化控制台输出的日志
            console: "%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %blue([%-5level]) %cyan(%logger{36}:%line) %msg%n"
    

    image-20210125141435366

    简单说明一下这段格式化的意思,学会大家就可以配置自己喜欢的格式了

    %red: 指定颜色,记得用小括号将内容包裹起来
    %d: 日期时间,后面的是日期格式化
    %thred: 线程名
    %-5level: 日志级别,%-5表示的是打印字符个数,如果个数不足则用空格补上
    %logger{36}: 输出日志的包名,最长36字符,超过则会简化,只会输出后面几个包名和类名
    %line: 输出日志的行数
    %msg: 输出的日志信息
    %n: 换行
    

    3、日志的持久化输出

    在日常的开发中,控制台输出的日志就满足开发的需求了。但是在测试生产环境下,日志的持久化保存就显得格外的重要,springBoot也考虑到了这一点,也拥有相对应的配置

    # 日志配置
    logging:
        # 输出日志文件的路径,log=相对路径,D:/log=绝对路径,文件名默认为spring.log
        path: D:/log
        # 输出到指定的文件中,同样可以指定相对路径
        file: log/spring-boot-logger.log
        pattern:
            # 持久化输出日志的格式,颜色不起作用,需要区别于控制台
            file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}:%line %msg%n"
    

    相对路径,指定logging.file输出

    相对路径

    绝对路径,指定logging.path输出

    绝对路径

    注意:logging.pathlogging.file只需指定一个便可,两个都指定时,仅会输出logging.file的日志

    三、高级配置

    在创建springBoot项目后,简单的日志配置可以满足我们大部分的需求,但我们有时需要高度自定义的日志,比如说

    • 按天生成日志:一天一份日志,排查问题就方便的多
    • 按日志大小来切割日志:假如日志超过存储大小,它会自动将日志写入新的文件中
    • 按日志等级输出独立的日志:一般选择ERROR级别的日志单独输出

    1、配置模板

    resources目录下,创建文件logback/logback.xml,并在配置文件指定logback的配置文件

    logging:
        config: classpath:logback/logback.xml
    

    logback.xml文件配置

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="30 seconds" debug="true">
    
        <!-- 获取日志文件的输出路径 -->
        <springProperty scope="context" name="LOG_PATH" source="logging.log_path"/>
        <!-- 获取该应用的名称 -->
        <springProperty scope="context" name="APPLICATION_NAME" source="spring.application.name"/>
    
        <!-- 定义日志输出格式和颜色 -->
        <property name="LOG_FORMAT_ONE" value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %blue([%-5level]) %cyan(%logger{36}:%line) %msg%n" />
        <property name="LOG_FORMAT_TWO" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}:%line %msg%n" />
    
        <!-- 输出到控制台 -->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <!-- 日志输出编码格式化 -->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <Pattern>${LOG_FORMAT_ONE}</Pattern>
                <charset>UTF-8</charset>
            </encoder>
            <!-- 过滤器,此过滤器低于阈值的不再显示 -->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>info</level>
            </filter>
        </appender>
    
        <!-- 时间日期滚动日志 -->
        <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 输出的日志远程,当天的日志名称 -->
            <file>${LOG_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.log</file>
            <!-- 策略配置 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 保存归纳的日志 -->
                <fileNamePattern>${LOG_PATH}/${APPLICATION_NAME}/%d{yyyy-MM-dd}/${APPLICATION_NAME}.log</fileNamePattern>
                <!-- 日志保存的天数 -->
                <maxHistory>180</maxHistory>
                <!-- 总容量 -->
                <totalSizeCap>10GB</totalSizeCap>
            </rollingPolicy>
            <!-- 日志输出编码格式化 -->
            <encoder>
                <pattern>${LOG_FORMAT_TWO}</pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!-- 时间日期滚动日志,只记录error级别的日志 -->
        <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}_error.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_PATH}/${APPLICATION_NAME}/%d{yyyy-MM-dd}/${APPLICATION_NAME}_error.log</fileNamePattern>
                <maxHistory>180</maxHistory>
                <totalSizeCap>10GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <pattern>${LOG_FORMAT_TWO}</pattern>
                <charset>UTF-8</charset>
            </encoder>
            <!-- 过滤器,日志级别过滤,仅输出error日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!-- 指定输出的日志等级,root代表工程所有包 -->
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE_INFO" />
            <appender-ref ref="FILE_ERROR" />
        </root>
    
        <!-- 指定输出的日志等级,指定包路径,此包下都以设置的等级输出 -->
        <!-- additivity表示日志是否向上传递,如果为true,日志在root可能会再次打印 -->
        <logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE_INFO" />
            <appender-ref ref="FILE_ERROR" />
        </logger>
    
    </configuration>
    

    2、通过运行环境来指定对应的输出策略

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="30 seconds" debug="true">
        <!-- 或者通过环境来指定输出的策略 -->
        <springProperty name="dev">
            <include resource="logback/logback-dev.xml" />
        </springProperty>
        <springProperty name="test | prod">
            <include resource="logback/logback-prod.xml" />
        </springProperty>
    </configuration>
    

    logback-dev.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- 开发环境,日志只至控制台 -->
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
    
        <logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE" />
        </logger>
    </included>
    

    logback-prod.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- 测试,生产环境,持久化日志文件 -->
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE_INFO" />
            <appender-ref ref="FILE_ERROR" />
        </root>
    
        <logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE_INFO" />
            <appender-ref ref="FILE_ERROR" />
        </logger>
    </included>
    

    3、相关配置标签

    标签名 属性 作用
    configuration scan:是否扫描日志配置文件,默认为true
    scanPeriod:扫描时间间隔,默认为60 seconds
    debug:是否打印出logback的日志,默认为false
    logback配置,当scan启用时,配置文件会定时检查并重新加载
    property name:属性名
    value:属性值
    file:可以引入properties文件的属性
    定义参数常量,可以使用${属性名}进行使用
    springProperty name:属性名
    source:取项目配置文件的属性源
    scope:作用域
    springBoot的扩展,将读取springBoot的配置文件,获取参数常量
    appender name:自定义的策略名
    class:指定输出策略的输出类,控制台输出或文件输出
    输出策略
    appender.file 此策略输出的文件路径,可以绝对路径,也可以相对路径
    appender.rollingPolicy class:指定回滚策略类 日志输出回滚策略配置
    appender.rollingPolicy.fileNamePattern 日志输出回滚的日志保存路径
    appender.rollingPolicy.maxHistory 日志最大保存天数
    appender.rollingPolicy.totalSizeCap 总日志最大的容量,指的不是单个文件
    appender.encoder 编码策略
    appender.encoder.pattern 指定输出的日志格式,控制台可以有颜色,但文件输出不行
    appender.encoder.charset 编码格式,一般都取utf-8
    appender.filter class:指定过滤器类
    注意:每个过滤器,子节点都不完全相同,建议查看源码和官方文档,也可以实现自己的过滤器
    日志输出的过滤策略
    root level:指定日志等级 该项目所有包的等级,比此等级高的日志信息会显示
    logger level:指定日志等级
    name:指定的包名或类名
    additivity:true/false,表示日志是否向上传递,如果为true,日志在root可能会再次打印
    功能与root基本一致,区别在于
    root是指定工程的所有包的,而logger需要自己指定包或类
    root.appender-ref
    logger.appender-ref
    ref:指定定义的appender策略的名字 指定输出的策略
    建议在最上层指定控制台,不然启动控制台就一个springBoot的Logo
    springProfile springBoot的扩展,可以通过环境指定,实现标签内的内容

    四、官方配置文档和git地址

  • 相关阅读:
    B-树和B+树的应用:数据搜索和数据库索引【转】
    与网络编程相关的信号:
    Reactor构架模式
    EINTR错误
    通讯链路的检测方法
    背景减法——自组织算法
    数据结构7_链二叉树
    背景减法——Vibe
    操作系统2_进程控制
    操作系统1_进程控制块PCB
  • 原文地址:https://www.cnblogs.com/banmoon/p/14331764.html
Copyright © 2011-2022 走看看