SpringBoot自定义Logback输出

173 阅读1分钟

SpringBoot自定义Logback输出

背景说明

  • springboot默认集成了logback的日志依赖,所以无需再次引入相关依赖
  • springboot默认的日志配置不支持输出到指定文件及配置相关策略
  • 该文章旨在快速配置,不会对细节做详细阐述

配置流程

  1. 新建logback-spring.xml配置文件,配置位置在resources根目录即可
  2. 在application.properties或者application.yml引用配置
# 应用名称,生成的日志名称引用该配置
spring.application.name=mybatis-pro
# 日志输出级别
root.log.level=debug
# 文件日志输出路径
root.log.path=/tmp/logs
# 文件日志保留时间,此处以天为单位
root.log.max-history=30
# 日志配置文件
logging.config=classpath:logback-spring.xml
  1. 详细logback-spring.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- 一、根节点<configuration>,包含下面三个属性-->
<!--1.scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true-->
<!--2.scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
<!--3.debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!--*********日志配置信息获取*********-->

    <springProperty name="app.name" source="spring.application.name" scope="context"/>
    <!-- 日志输出级别 -->
    <springProperty name="root.log.level" source="root.log.level" defaultValue="INFO" scope="context"/>
    <!-- 日志存放路径 -->
    <springProperty name="root.log.path" source="root.log.path" defaultValue="/tmp/logs" scope="context"/>
    <!-- 文件日志最大存放时间-->
    <springProperty name="root.log.max-history" source="root.log.max-history" defaultValue="30" scope="context"/>

    <!--*********输出日志配置*********-->

    <!-- 控制台输出格式 -->
    <property name="console.log.pattern"
              value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) %highlight(%-5level) %green(${PID:- }) --- %cyan([%15.15thread]) %magenta([%-30.30logger{29}]) %blue(%-5L) : %msg%n"/>

    <!-- 文件输出格式 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level ${PID:- } --- [%15.15thread] [%-30.30logger{29}] %-5L : %msg%n"/>

    <!-- 控制台输出 -->
    <appender name="CONSOLE_LOG" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${console.log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 文件输出 -->
    <appender name="FILE_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${root.log.path}/${app.name}.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${root.log.path}/${app.name}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 30天 -->
            <maxHistory>${root.log.max-history}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>${root.log.level}</level>
            <!--DENY:表示不用看后面的过滤器了,这里就给拒绝了,不作记录。-->
            <!--NEUTRAL:表示需不需要记录,还需要看后面的过滤器。若所有过滤器返回的全部都是NEUTRAL,那么需要记录日志。-->
            <!--ACCEPT:表示不用看后面的过滤器了,这里就给直接同意了,需要记录。-->
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>NEUTRAL</onMismatch>
        </filter>
    </appender>

    <!--*********异步输出日志配置*********-->

    <!-- 异步输出 -->
    <appender name="ASYNC_FILE_LOG" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>1024</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="FILE_LOG"/>
        <neverBlock>true</neverBlock>
    </appender>

    <!--*********设置一些包的打印级别,过滤一些无用信息*********-->

    <!-- Spring日志级别控制 -->
    <logger name="org.springframework" level="info"/>
    <logger name="_org.springframework" level="info"/>

    <!--*********整合控制台输出和文件输出*********-->
    <root>
        <level value="${root.log.level}"/>
        <appender-ref ref="CONSOLE_LOG"/>
        <appender-ref ref="ASYNC_FILE_LOG"/>
    </root>

</configuration>

输出展示

image.png