美文网首页
日志框架 - 基于spring-boot - 实现1 - 配置文

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

作者: 船前几度寄芳心 | 来源:发表于2018-04-28 00:01 被阅读0次

    日志框架系列讲解文章
    日志框架 - 基于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 - 实现1 - 配置文

          本文链接:https://www.haomeiwen.com/subject/oolvlftx.html