51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

SpringBoot 使用 logback 配置日志输出到文件

前言 {#toc_0}

项目上线之后按要求需要对日志进行存储管理,故对项目中的日志打印进行配置。

具体配置实现: {#toc_1}

1、在resource目录下创建文件: {#toc_2}

logback-custom.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒;当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态,默认值为false。 -->
<configuration debug="false" scan="true" scanPeriod="10 second">
    <!-- 项目名  -->
    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
    <!-- 当前环境 dev/product   -->
    <springProperty scope="context" name="ENV" source="logging.env"/>
    <!-- 设置日志保留的时间,单位为天 -->
    <springProperty scope="context" name="MAX_HISTORY" source="logging.max-history"/>

    &lt;!-- 配置日志输出目录文件夹以及进行重命名 --&gt;
    &lt;property name="ROOT" value="logs/${APP_NAME}/"/&gt;
    &lt;!-- 配置日志文件大小 --&gt;
    &lt;property name="FILESIZE" value="50MB"/&gt;
    &lt;!-- 格式化输出日期 --&gt;
    &lt;timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm:ss.SSS"/&gt;

    &lt;!-- 第一个文件输出,每天产生一个文件 --&gt;
    &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&gt;
            &lt;!-- 输出文件路径+文件名 --&gt;
            &lt;fileNamePattern&gt;${ROOT}%d/all_%i.log&lt;/fileNamePattern&gt;
            &lt;maxHistory&gt;${MAX_HISTORY}&lt;/maxHistory&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&gt;
                &lt;maxFileSize&gt;${FILESIZE}&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
        &lt;/rollingPolicy&gt;
        &lt;encoder charset="UTF-8"&gt;
            &lt;!-- 输出日志记录格式 --&gt;
            &lt;pattern&gt;%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern&gt;
        &lt;/encoder&gt;
    &lt;/appender&gt;

    &lt;!-- 把日志异步输出到磁盘文件中,避免每次都进行磁盘IO操作 --&gt;
    &lt;appender name="ASYNC-FILE" class="ch.qos.logback.classic.AsyncAppender"&gt;
        &lt;!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --&gt;
        &lt;discardingThreshold&gt;0&lt;/discardingThreshold&gt;
        &lt;queueSize&gt;256&lt;/queueSize&gt;
        &lt;!-- 添加附加的appender,最多只能添加一个 --&gt;
        &lt;appender-ref ref="FILE"/&gt;
    &lt;/appender&gt;

    &lt;!-- 控制台打印 --&gt;
    &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt;
        &lt;encoder charset="utf-8"&gt;
            &lt;!-- 格式化日志输出:
             %-5level表示级别从左显示5个字符宽度,%d表示日期,%thread表示线程名,%m表示日志消息,%n是换行符
             %logger{36}表示logger是class的全名,36表示限制最长字符
            --&gt;
            &lt;pattern&gt;[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n&lt;/pattern&gt;
        &lt;/encoder&gt;
    &lt;/appender&gt;

    &lt;!-- ERROR日志输出到文件  --&gt;
    &lt;appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
        &lt;encoder charset="utf-8"&gt;
            &lt;pattern&gt;[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %m%n&lt;/pattern&gt;
        &lt;/encoder&gt;
        &lt;!-- 设置当前日志文档输出的级别,只记录ERROR级别的日志 --&gt;
        &lt;filter class="ch.qos.logback.classic.filter.LevelFilter"&gt;
            &lt;level&gt;ERROR&lt;/level&gt;
            &lt;onMatch&gt;ACCEPT&lt;/onMatch&gt;
            &lt;onMismatch&gt;DENY&lt;/onMismatch&gt;
        &lt;/filter&gt;
        &lt;!-- 设置日志记录器的滚动策略,按日期和大小记录--&gt;
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&gt;
            &lt;fileNamePattern&gt;${ROOT}%d/error.%i.log&lt;/fileNamePattern&gt;
            &lt;maxHistory&gt;${MAX_HISTORY}&lt;/maxHistory&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&gt;
                &lt;maxFileSize&gt;${FILESIZE}&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
        &lt;/rollingPolicy&gt;
    &lt;/appender&gt;

    &lt;!-- WARN日志输出到文件 --&gt;
    &lt;appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
        &lt;encoder charset="utf-8"&gt;
            &lt;pattern&gt;[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %m%n&lt;/pattern&gt;
        &lt;/encoder&gt;
        &lt;filter class="ch.qos.logback.classic.filter.LevelFilter"&gt;
            &lt;level&gt;WARN&lt;/level&gt;
            &lt;onMatch&gt;ACCEPT&lt;/onMatch&gt;
            &lt;onMismatch&gt;DENY&lt;/onMismatch&gt;
        &lt;/filter&gt;
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&gt;
            &lt;fileNamePattern&gt;${ROOT}%d/warn.%i.log&lt;/fileNamePattern&gt;
            &lt;maxHistory&gt;${MAX_HISTORY}&lt;/maxHistory&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&gt;
                &lt;maxFileSize&gt;${FILESIZE}&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
        &lt;/rollingPolicy&gt;
    &lt;/appender&gt;

    &lt;!-- INFO日志输出到文件 --&gt;
    &lt;appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
        &lt;encoder charset="utf-8"&gt;
            &lt;pattern&gt;[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %m%n&lt;/pattern&gt;
        &lt;/encoder&gt;
        &lt;filter class="ch.qos.logback.classic.filter.LevelFilter"&gt;
            &lt;level&gt;INFO&lt;/level&gt;
            &lt;onMatch&gt;ACCEPT&lt;/onMatch&gt;
            &lt;onMismatch&gt;DENY&lt;/onMismatch&gt;
        &lt;/filter&gt;
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&gt;
            &lt;fileNamePattern&gt;${ROOT}%d/info.%i.log&lt;/fileNamePattern&gt;
            &lt;maxHistory&gt;${MAX_HISTORY}&lt;/maxHistory&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&gt;
                &lt;maxFileSize&gt;${FILESIZE}&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
        &lt;/rollingPolicy&gt;
    &lt;/appender&gt;

    &lt;!-- DEBUG日志输出到文件 --&gt;
    &lt;appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
        &lt;encoder charset="utf-8"&gt;
            &lt;pattern&gt;[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %m%n&lt;/pattern&gt;
        &lt;/encoder&gt;
        &lt;filter class="ch.qos.logback.classic.filter.LevelFilter"&gt;
            &lt;level&gt;DEBUG&lt;/level&gt;
            &lt;onMatch&gt;ACCEPT&lt;/onMatch&gt;
            &lt;onMismatch&gt;DENY&lt;/onMismatch&gt;
        &lt;/filter&gt;
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&gt;
            &lt;fileNamePattern&gt;${ROOT}%d/debug.%i.log&lt;/fileNamePattern&gt;
            &lt;maxHistory&gt;${MAX_HISTORY}&lt;/maxHistory&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&gt;
                &lt;maxFileSize&gt;${FILESIZE}&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
        &lt;/rollingPolicy&gt;
    &lt;/appender&gt;

    &lt;!-- TRACE日志输出到文件 --&gt;
    &lt;appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
        &lt;encoder charset="utf-8"&gt;
            &lt;pattern&gt;[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %m%n&lt;/pattern&gt;
        &lt;/encoder&gt;
        &lt;filter class="ch.qos.logback.classic.filter.LevelFilter"&gt;
            &lt;level&gt;TRACE&lt;/level&gt;
            &lt;onMatch&gt;ACCEPT&lt;/onMatch&gt;
            &lt;onMismatch&gt;DENY&lt;/onMismatch&gt;
        &lt;/filter&gt;
        &lt;rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&gt;
            &lt;fileNamePattern&gt;${ROOT}%d/trace.%i.log&lt;/fileNamePattern&gt;
            &lt;maxHistory&gt;${MAX_HISTORY}&lt;/maxHistory&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&gt;
                &lt;maxFileSize&gt;${FILESIZE}&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
        &lt;/rollingPolicy&gt;
    &lt;/appender&gt;

    &lt;!-- 输出sql相关日志,不需要可删除;additivity:是否向上级loger传递打印信息,默认是true--&gt;
    &lt;logger name="org.apache.ibatis" level="INFO" additivity="false"/&gt;
    &lt;logger name="org.mybatis.spring" level="INFO" additivity="false"/&gt;
    &lt;logger name="com.github.miemiedev.mybatis.paginator" level="INFO" additivity="false"/&gt;

    &lt;!-- logger设置输出到文件,输出级别为info --&gt;
    &lt;root level="INFO"&gt;
        &lt;appender-ref ref="DEBUG"/&gt;
        &lt;appender-ref ref="ERROR"/&gt;
        &lt;appender-ref ref="WARN"/&gt;
        &lt;appender-ref ref="INFO"/&gt;
        &lt;appender-ref ref="TRACE"/&gt;
        &lt;!-- 异步输出所有日志到文件--&gt;
        &lt;appender-ref ref="ASYNC-FILE"/&gt;
        &lt;!-- 控制台输出--&gt;
        &lt;if condition='property("ENV").equals("dev")'&gt;
            &lt;then&gt;
                &lt;appender-ref ref="STDOUT"/&gt;
            &lt;/then&gt;
        &lt;/if&gt;
    &lt;/root&gt;



`</configuration>
`

2、在配置文件里面有如下配置: {#toc_3}

spring:
  application:
    # 应用名称
    name: project
logging:
  config: classpath:logback-custom.xml
  # 环境:生产环境 product 开发环境 dev
  # 生产环境不打印日志到控制台 开发环境反之
  env: product
  max-history: 365

说明: {#toc_4}

  • 为什么 logback 配置文件名称不用默认的logback.xml或者logback-spring.xml ?

可以使用,但是当你的yaml配置文件是使用nacos来管理的时候,系统启动的时候会读取不到springProperty标签中的内容,因为springboot读取配置文件是有优先级的,如果使用默认的logback.xml或者logback-spring.xml为配置文件名则会读取不到nacos上的配置。命名为logback-spring.xml程序只会在运行后一段时间内报错,一段时间后读取到nacos上的配置文件之后会正常,但是有瑕疵。logback.xml直接运行失败。所以得使用自定义命名logback配置名称。如:logback-logstash.xml或者其它,此处我用的是logback-custom.xml

参考文档: {#toc_5}

赞(0)
未经允许不得转载:工具盒子 » SpringBoot 使用 logback 配置日志输出到文件