spring boot使用经验分享(三)logback

springboot本身就继承了logback,但是想要输出日志还是需要各种配置(日志切分、格式、异步等),这种做下简单的总结。

一、配置文件

在resource下创建logback-spring.xml文件

使用springProperty标签

<springProperty scope="context" name="LOG_HOME" source="log.path" defaultValue="./logs"/>

<springProperty> 与Logback的标准 <property> 标签类似,根据source在对应文件加载配置。如果没有设置该属性的值,默认使用defaultValue。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
     <!-- 日志文件编码 -->
    <property name="LOG_CHARSET" value="UTF-8"/>

    <!-- 日志文件路径 -->
    <property name="LOG_DIR" value="${LOG_HOME}"/>

    <!-- 日志根目录 -->
    <springProperty scope="context" name="LOG_HOME" source="log.path" defaultValue="./logs"/>

    <!-- 日志文件名称 -->
    <springProperty scope="context" name="LOG_ROOT_LEVEL" source="log.root.level" defaultValue="INFO"/>

    <!-- 是否输出到控制台 -->
    <springProperty scope="context" name="LOG_STDOUT" source="log.stdout" defaultValue="false"/>

    <!-- 配置日志的滚动时间按小时滚动,默认保留3天 -->
    <springProperty scope="context" name="MAX_HISTORY_BIZ_HOUR" source="log.maxHistory.biz.hour" defaultValue="72"/>
    <springProperty scope="context" name="MAX_HISTORY_ERROR_HOUR" source="log.maxHistory.error.hour" defaultValue="72"/>
    <springProperty scope="context" name="MAX_HISTORY_DEBUG_HOUR" source="log.maxHistory.debug.hour" defaultValue="72"/>
    <springProperty scope="context" name="MAX_SIZE_CAP_VALUE" source="log.max.size.cap" defaultValue="4GB"/>

    <!--日志格式化 -->
    <property name="LOG_MSG"
              value="%level %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread %logger{36}] %msg%n"/>

    <property name="MAX_HISTORY_BIZ" value="${MAX_HISTORY_BIZ_HOUR}"/>
    <property name="MAX_HISTORY_ERROR" value="${MAX_HISTORY_ERROR_HOUR}"/>
    <property name="MAX_HISTORY_DEBUG" value="${MAX_HISTORY_DEBUG_HOUR}"/>
    <property name="MAX_SIZE_CAP" value="${MAX_SIZE_CAP_VALUE}"/>

    <!--输出到控制台 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <!-- 下面为配置只输出INFO以及其之下级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!-- 输出的日志内容格式化 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_MSG}</pattern>
        </layout>
    </appender>

    <!-- 定义 DEBUG 日志的输出方式: -->
    <appender name="FILE_DEBUG"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 下面为配置只输出DEBUG级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <!--日志文件路径,日志文件名称 -->
        <File>${LOG_DIR}/debug.log</File>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/debug.log.%d{yyyyMMddHH}
            </fileNamePattern>
            <maxHistory>${MAX_HISTORY_DEBUG}</maxHistory>
            <totalSizeCap>${MAX_SIZE_CAP}</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>

        <!-- 输出的日志内容格式化 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_MSG}</pattern>
        </layout>
    </appender>

    <appender name="FILE_BIZ"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 下面为配置只输出INFO以及其之下级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!--日志文件路径,日志文件名称 -->
        <File>${LOG_DIR}/biz.log</File>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/biz.log.%d{yyyyMMddHH}
            </fileNamePattern>
            <maxHistory>${MAX_HISTORY_BIZ}</maxHistory>
            <totalSizeCap>${MAX_SIZE_CAP}</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>

        <!-- 输出的日志内容格式化 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_MSG}</pattern>
        </layout>
    </appender>

    <!-- 定义 ERROR 日志的输出方式: -->
    <appender name="FILE_ERROR"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 下面为配置只输出error级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <!--日志文件路径,日志文件名称 -->
        <File>${LOG_DIR}/err.log</File>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/err.log.%d{yyyyMMddHH}
            </fileNamePattern>
            <maxHistory>${MAX_HISTORY_ERROR}</maxHistory>
            <totalSizeCap>${MAX_SIZE_CAP}</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>

        <!-- 输出的日志内容格式化 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>${LOG_MSG}</Pattern>
        </layout>
    </appender>

    <!-- 异步日志 -->
    <appender name="ASYNC_FILE_BIZ"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>256</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="FILE_BIZ"/>
    </appender>


    <!--DEBUG -->
    <appender name="ASYNC_FILE_DEBUG"
              class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="FILE_DEBUG"/>
    </appender>


    <!-- ERROR -->
    <appender name="ASYNC_FILE_ERROR"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="FILE_ERROR"/>
    </appender>
    
    <!-- ${LOG_ROOT_LEVEL} 日志级别 -->
    <root level="${LOG_ROOT_LEVEL}">

        <if condition='property("LOG_STDOUT").equals("true")'>
            <then>
                <appender-ref ref="STDOUT"/>
            </then>
        </if>


       <appender-ref ref="ASYNC_FILE_DEBUG"/>

       <appender-ref ref="ASYNC_FILE_BIZ"/>


       <appender-ref ref="ASYNC_FILE_ERROR"/>

       

    </root>

</configuration>

二、说明

logback配置有几点需要注意的

1)生产环境不要输出控制台日志

2)建议异步输出日志,可以极大的提高性能。

3)最好不要打印行号,对性能影响不小

4)如果可能尽量缩短日志长度

发布了43 篇原创文章 · 获赞 0 · 访问量 3911

猜你喜欢

转载自blog.csdn.net/zhangdx001/article/details/105016648