在springboot中默认使用的日志就是logback,默认配置一般是够用了,但如果还想更加详细的配置就需要使用我们重新配置logback了。

使用springboot配置logback

这种是只使用springboot提供的application.properties来配置logback。

以下配置大多为默认配置

logging:
  file:
#生成的文件最多存留多久
    max-history: 30
#生成的文件最大大小
    max-size: 100MB
#日志文件存储路径
    path: ./logs/${spring.application.name}
#是否在系统重启时清空日志文件里的内容
    clean-history-on-start: false
#日志文件名,在当前文件夹内生成,与logging.file.path使用其一即可
#    name: ${spring.application.name}.log
#生成的总日志文件大小
    total-size-cap: 10GB
#日志级别
  level:
#总级别
    root: info
#特殊包的级别
    org.apache.ibatis: debug
  pattern:
    rolling-file-name: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
    console: %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}
    file: '%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}'
    dateformat: yyyy-MM-dd HH:mm:ss.SSS
    level: %5p

使用logback配置文件

logback给我们提供了四种配置文件

  • logback.xml
  • logback-spring.xml
  • logback.groovy
  • logback-spring.groovy

logback配置在springboot中的加载顺序是logback.xml->application.properties->logback-spring.xml

logback-spring.xml中我们可以使用Spring里配置,所以推荐使用这种方式来配置logback。
下面我提供两种可用于生产环境的配置,看你们的使用习惯来选择

所有级别日志在同一个文件内出现

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<!-- 由于系统刚启动时还未加载application配置,因此最好配置默认值 -->
    <contextName>${APP_NAME}</contextName>
    <springProperty name="APP_NAME" scope="context" source="spring.application.name" defaultValue="log-demo"/>
    <springProperty name="LOG_FILE" scope="context" source="logging.file.path" defaultValue="./logs/${APP_NAME}"/>
    <springProperty name="LOG_MAX_FILE_SIZE" scope="context" source="logging.max-size" defaultValue="100MB"/>
    <springProperty name="LOG_MAX_FILE_DAY" scope="context" source="logging.file.max-history" defaultValue="30"/>
    <springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
    <springProperty name="ServerPort" scope="context" source="server.port" defaultValue="0000"/>
    <springProperty name="TotalSizeCap" scope="context" source="logging.file.total-size-cap" defaultValue="5GB"/>

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <!-- 彩色日志格式 -->
<!--格式化输出:%X的内容需要自己在项目内添加(比如拦截器内等),%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%PID进程号,%logger{36}表示类路径仅显示36个字符,%M表示方法名,%line表示输出行号,%m:日志消息,%n是换行符-->
    <property name="CONSOLE_LOG_PATTERN"
              value=" [${APP_NAME}:${ServerIP}:${ServerPort}] [%clr(%X{traceId}){yellow},%clr(%X{X-B3-TraceId}){yellow}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger{36}#%M){cyan} %clr([line-%line]){red} - %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    <!-- 正常颜色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN_NO_COLOR"
              value=" [${APP_NAME}:${ServerIP}:${ServerPort}] [%X{traceId},%X{X-B3-TraceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%thread] %logger{36}#%M [line-%line] - %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>


    <!-- Console 输出设置 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_FILE}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
            <!--保留时间,单位:天-->
            <maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
            <!-- 保留的总文件的最大大小 -->
            <totalSizeCap>${TotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

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

    <springProfile name="dev,test">
        <root level="INFO">
            <appender-ref ref="ASYNC"/>
            <appender-ref ref="CONSOLE"/>
        </root>
        <logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
        </logger>
        <logger name="com.bennett.demo" level="DEBUG"/>
    </springProfile>
    <springProfile name="prod">
        <root level="WARN">
            <appender-ref ref="ASYNC"/>
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>
</configuration>

每个级别日志单独存储

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <contextName>${APP_NAME}</contextName>

    <springProperty name="APP_NAME" scope="context" source="spring.application.name" defaultValue="log-demo"/>
    <springProperty name="LOG_FILE" scope="context" source="logging.file.path" defaultValue="./logs/${APP_NAME}"/>
    <springProperty name="LOG_MAX_FILE_SIZE" scope="context" source="logging.max-size" defaultValue="100MB"/>
    <springProperty name="LOG_MAX_FILE_DAY" scope="context" source="logging.file.max-history" defaultValue="30"/>
    <springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
    <springProperty name="ServerPort" scope="context" source="server.port" defaultValue="0000"/>
    <springProperty name="TotalSizeCap" scope="context" source="logging.file.total-size-cap" defaultValue="5GB"/>

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="[${APP_NAME}:${ServerIP}:${ServerPort}] [%clr(%X{traceId}){yellow},%clr(%X{X-B3-TraceId}){yellow}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger{36}#%M){cyan} %clr([line-%line]){red} - %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    <!-- 正常颜色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN_NO_COLOR"
              value="[${APP_NAME}:${ServerIP}:${ServerPort}] [%X{traceId},%X{X-B3-TraceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%thread] %logger{36}#%M [line-%line] - %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>


    <!-- 控制台日志 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <withJansi>true</withJansi>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 按照每天生成常规日志文件 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}/${APP_NAME}-error.log</file>
        <!-- 基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
            <!--保留时间,单位:天-->
            <maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
            <!-- 保留的总文件的最大大小 -->
            <totalSizeCap>${TotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>${LOG_MAX_FILE_SIZE}</MaxFileSize>
        </triggeringPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 按照每天生成常规日志文件 -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}/${APP_NAME}-info.log</file>
        <!-- 基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}/${APP_NAME}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
            <!--保留时间,单位:天-->
            <maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
            <!-- 保留的总文件的最大大小 -->
            <totalSizeCap>${TotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 按照每天生成常规日志文件 -->
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}/${APP_NAME}-debug.log</file>
        <!-- 基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}/${APP_NAME}-debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
            <!--保留时间,单位:天-->
            <maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
            <!-- 保留的总文件的最大大小 -->
            <totalSizeCap>${TotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 按照每天生成常规日志文件 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}/${APP_NAME}-warn.log</file>
        <!-- 基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}/${APP_NAME}-warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
            <!--保留时间,单位:天-->
            <maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
            <!-- 保留的总文件的最大大小 -->
            <totalSizeCap>${TotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

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

    <springProfile name="dev,test">
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="ASYNC-ERROR"/>
            <appender-ref ref="ASYNC-WARN"/>
            <appender-ref ref="ASYNC-INFO"/>
            <appender-ref ref="ASYNC-DEBUG"/>
        </root>
        <logger name="com.bennett.demo" level="DEBUG"/>
    </springProfile>

    <springProfile name="prod">
        <root level="WARN">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="ERROR"/>
            <appender-ref ref="WARN"/>
            <appender-ref ref="INFO"/>
            <appender-ref ref="DEBUG"/>
        </root>
    </springProfile>
</configuration>

如果有什么疑问,好的建议欢迎在评论区留言!