日志框架 - 基于spring-boot - 实现1 - 配置文件

日志框架系列讲解文章
日志框架 - 基于spring-boot - 使用入门
日志框架 - 基于spring-boot - 设计
日志框架 - 基于spring-boot - 实现1 - 配置文件
日志框架 - 基于spring-boot - 实现2 - 消息定义及消息日志打印
日志框架 - 基于spring-boot - 实现3 - 关键字与三种消息解析器
日志框架 - 基于spring-boot - 实现4 - HTTP请求拦截
日志框架 - 基于spring-boot - 实现5 - 线程切换
日志框架 - 基于spring-boot - 实现6 - 自动装配

上一篇我们讲解了日志框架的总体设计
本篇讲日志框架实现的第一部分:配置文件

Spring Boot默认日志框架是logback,实现日志框架需要自定义logback的配置,根据官方文档的指引,在classpath目录下新增文件名为logback-spring.xml的配置文件。文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!--第1步. 引入spring-boot提供的默认格式配置-->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!--第2步.定义从application.properties引入的配置-->  
    <!--spring-boot logging.path-->
    <property name="LOG_PATH" value="${LOG_PATH:-./logs}"/>
    <!--spring-boot logging.file-->
    <property name="LOG_FILE"
              value="${LOG_PATH}/${LOG_FILE:-spring.log}"/>
    <springProperty scope="context" name="ROOT_PACKAGE"
                    source="xpay.framework.logging.package.root"
                    defaultValue="com"/>
    <springProperty scope="context" name="LOG_TO_CONSOLE"
                    source="xpay.framework.logging.log-to-console"
                    defaultValue="false"/>
    <!--message log patterns-->
    <springProperty scope="context" name="MESSAGE_FILENAME_PATTERN"
                    source="xpay.framework.logging.logback.message.filename.pattern"
                    defaultValue="%d{yyyy-MM-dd}/message.log.%d{yyyy-MM-dd}"/>
    <springProperty scope="context" name="MESSAGE_ENCODER_PATTERN"
                    source="xpay.framework.logging.logback.message.encoder.pattern"
                    defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n"/>
    <springProperty scope="context" name="MESSAGE_MAX_FILE_SIZE"
                    source="xpay.framework.logging.logback.message.max-file-size"
                    defaultValue="200MB"/>
    <!--system log patterns-->
    <springProperty scope="context" name="SYSTEM_FILENAME_PATTERN"
                    source="xpay.framework.logging.logback.system.filename.pattern"
                    defaultValue="%d{yyyy-MM-dd}/info.log.%d{yyyy-MM-dd}"/>
    <springProperty scope="context" name="SYSTEM_ENCODER_PATTERN"
                    source="xpay.framework.logging.logback.system.encoder.pattern"
                    defaultValue="${FILE_LOG_PATTERN}"/>
    <springProperty scope="context" name="SYSTEM_MAX_FILE_SIZE"
                    source="xpay.framework.logging.logback.system.max-file-size"
                    defaultValue="200MB"/>
    <!--alarm log patterns-->
    <springProperty scope="context" name="ALARM_FILENAME_PATTERN"
                    source="xpay.framework.logging.logback.alarm.filename.pattern"
                    defaultValue="alarm/alarm.log.%d{yyyy-MM-dd}"/>
    <springProperty scope="context" name="ALARM_ENCODER_PATTERN"
                    source="xpay.framework.logging.logback.alarm.encoder.pattern"
                    defaultValue="${FILE_LOG_PATTERN}"/>
    <!--第3步. 引入spring-boot提供的默认文件配置-->
    <include
            resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <include
            resource="org/springframework/boot/logging/logback/file-appender.xml"/>

    <!--第4步. 定义三种日志 Appender-->
    <!-- 处理消息日志 -->
    <appender name="MESSAGE_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${MESSAGE_FILENAME_PATTERN}.%i
            </fileNamePattern>
            <maxFileSize>${MESSAGE_MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <encoder>
            <outputPatternAsHeader>true</outputPatternAsHeader>
            <charset>utf8</charset>
            <pattern>${MESSAGE_ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="ASYNC_MESSAGE_APPENDER"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!--以每个日志内容2KB大小计算,最大缓存10MB的日志。-->
        <queueSize>5000</queueSize>
        <!--单位为毫秒-->
        <maxFlushTime>1000</maxFlushTime>
        <appender-ref ref="MESSAGE_APPENDER"/>
    </appender>
    <!-- 系统运行日志 -->
    <appender name="SYSTEM_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${SYSTEM_FILENAME_PATTERN}.%i
            </fileNamePattern>
            <maxFileSize>${SYSTEM_MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <encoder>
            <outputPatternAsHeader>true</outputPatternAsHeader>
            <charset>utf8</charset>
            <pattern>${SYSTEM_ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="ASYNC_SYSTEM_APPENDER"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!--以每个日志内容0.5KB大小为基础,大约允许缓存10MB的日志。-->
        <queueSize>20000</queueSize>
        <!--单位为毫秒-->
        <maxFlushTime>1000</maxFlushTime>
        <appender-ref ref="SYSTEM_APPENDER"/>
    </appender>
    <!-- 告警日志记录 -->
    <appender name="ALARM_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--deny all events with a level below this level-->
            <level>WARN</level>
        </filter>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${ALARM_FILENAME_PATTERN}
            </fileNamePattern>
        </rollingPolicy>
        <encoder>
            <outputPatternAsHeader>true</outputPatternAsHeader>
            <charset>utf8</charset>
            <pattern>${ALARM_ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="ASYNC_ALARM_APPENDER"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!--以每个日志内容0.5KB大小为基础,大约允许缓存1MB的日志。-->
        <queueSize>2000</queueSize>
        <!--单位为毫秒 -->
        <maxFlushTime>500</maxFlushTime>
        <appender-ref ref="ALARM_APPENDER"/>
    </appender>


    <!--第5步. 定义默认的logger 与appender 的对应关第-->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="ASYNC_SYSTEM_APPENDER"/>
        <appender-ref ref="ASYNC_ALARM_APPENDER"/>
    </root>
    <if condition='property("LOG_TO_CONSOLE").contains("true")'>
        <then>
            <logger name="${ROOT_PACKAGE}" level="INFO" additivity="true">
                <appender-ref ref="ASYNC_ALARM_APPENDER"/>
                <appender-ref ref="ASYNC_SYSTEM_APPENDER"/>
            </logger>
        </then>
        <else>
            <logger name="${ROOT_PACKAGE}" level="INFO" additivity="false">
                <appender-ref ref="ASYNC_ALARM_APPENDER"/>
                <appender-ref ref="ASYNC_SYSTEM_APPENDER"/>
            </logger>
        </else>
    </if>
    <logger name="com.cmsz.framework.logging.aop.MessageToLogAspect"
            level="INFO" additivity="true">
        <appender-ref ref="ASYNC_MESSAGE_APPENDER"/>
    </logger>
</configuration>

如上文件所示,配置文件包含几个部分:

  1. 引入配置文件Spring Boot在org.springframework.boot.logging.logback包中提供了4个默认的logback配置文件,分别是base.xml,console-appender.xml,defaults.xml,file-appender.xml,本配置文件里在第1步与第3步中分别引入。
  2. 定义配置项:为了在Spring Boot的配置文件(如application.properties文件)中能配置日志文件名及日志打印格式,第2步定义了许多与Spring配置项对应的属性(property
    3.定义Appender: 第4步分别为三种日志(系统运行日志,消息日志与告警日志)定义输出文件及格式,并使用异步的Appender避免I/O成为系统性能开销的瓶颈。
  3. 定义Logger:第5步定义默认的logger,与对应的日志级别。

至此,logback的配置基本完成。

上一篇:日志框架 - 基于spring-boot - 设计


下一篇:日志框架 - 基于spring-boot - 实现4 - HTTP请求拦截