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