日志框架系列講解文章
日志框架 - 基于spring-boot - 使用入門(mén)
日志框架 - 基于spring-boot - 設(shè)計(jì)
日志框架 - 基于spring-boot - 實(shí)現(xiàn)1 - 配置文件
日志框架 - 基于spring-boot - 實(shí)現(xiàn)2 - 消息定義及消息日志打印
日志框架 - 基于spring-boot - 實(shí)現(xiàn)3 - 關(guān)鍵字與三種消息解析器
日志框架 - 基于spring-boot - 實(shí)現(xiàn)4 - HTTP請(qǐng)求攔截
日志框架 - 基于spring-boot - 實(shí)現(xiàn)5 - 線(xiàn)程切換
日志框架 - 基于spring-boot - 實(shí)現(xiàn)6 - 自動(dòng)裝配
上一篇我們講解了日志框架的總體設(shè)計(jì)
本篇講日志框架實(shí)現(xiàn)的第一部分:配置文件
Spring Boot默認(rèn)日志框架是logback,實(shí)現(xiàn)日志框架需要自定義logback的配置鲤脏,根據(jù)官方文檔的指引大咱,在classpath目錄下新增文件名為logback-spring.xml的配置文件。文件內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!--第1步. 引入spring-boot提供的默認(rèn)格式配置-->
<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提供的默認(rèn)文件配置-->
<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>
<!--以每個(gè)日志內(nèi)容2KB大小計(jì)算烛占,最大緩存10MB的日志。-->
<queueSize>5000</queueSize>
<!--單位為毫秒-->
<maxFlushTime>1000</maxFlushTime>
<appender-ref ref="MESSAGE_APPENDER"/>
</appender>
<!-- 系統(tǒng)運(yùn)行日志 -->
<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>
<!--以每個(gè)日志內(nèi)容0.5KB大小為基礎(chǔ),大約允許緩存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>
<!--以每個(gè)日志內(nèi)容0.5KB大小為基礎(chǔ)谆趾,大約允許緩存1MB的日志。-->
<queueSize>2000</queueSize>
<!--單位為毫秒 -->
<maxFlushTime>500</maxFlushTime>
<appender-ref ref="ALARM_APPENDER"/>
</appender>
<!--第5步. 定義默認(rèn)的logger 與appender 的對(duì)應(yīng)關(guān)第-->
<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>
如上文件所示叛本,配置文件包含幾個(gè)部分:
- 引入配置文件:Spring Boot在org.springframework.boot.logging.logback包中提供了4個(gè)默認(rèn)的logback配置文件沪蓬,分別是base.xml,console-appender.xml来候,defaults.xml跷叉,file-appender.xml,本配置文件里在第1步與第3步中分別引入营搅。
-
定義配置項(xiàng):為了在Spring Boot的配置文件(如application.properties文件)中能配置日志文件名及日志打印格式云挟,第2步定義了許多與Spring配置項(xiàng)對(duì)應(yīng)的屬性(property)
3.定義Appender: 第4步分別為三種日志(系統(tǒng)運(yùn)行日志,消息日志與告警日志)定義輸出文件及格式转质,并使用異步的Appender避免I/O成為系統(tǒng)性能開(kāi)銷(xiāo)的瓶頸园欣。 - 定義Logger:第5步定義默認(rèn)的logger,與對(duì)應(yīng)的日志級(jí)別峭拘。
至此俊庇,logback的配置基本完成。