在我们平时系统中,日志输出在控制台中,重启项目后,之前的日志就丢失了,我们可以借助 logback
将系统日志保存到日志文件中。Spring Boot 项目在引用了 spring-boot-starter-logging
依赖后,默认使用 logback
来记录日志。引用 spring-boot-starter-web
依赖,该依赖包含了 spring-boot-starter-logging
, 所以无需再次引入 spring-boot-starter-logging
依赖:
添加 logback
配置文件,在模块的 resources
下新建 logback
配置文件 logback-spring.xml
内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>BNTang</contextName>
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<property name="log.path" value="log/bntang"/>
<property name="log.maxHistory" value="15"/>
<property name="log.colorPattern"
value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %boldCyan([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]) %yellow(%thread) %green(%logger) %msg%n"/>
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss} %-5level [${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] %thread %logger %msg%n"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.colorPattern}</pattern>
</encoder>
</appender>
<!--输出到文件-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<MaxHistory>${log.maxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="debug">
<appender-ref ref="console"/>
</root>
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>
logback 配置文件大致结构如下所示:
<configuration>
<property/>
<appender/>
<root/>
</configuration>
下面详细介绍下这些标签的作用,介绍完后,再回来看这个配置文件,你应该就能看懂它的含义了。
<configuration>
为 logback 配置文件的 根
标签,该标签包含三个属性:
-
scan
:当此属性设置为 true 时,配置文件如果发生改变,将会被重新加载,默认值为 true。-
scanPeriod
:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒
。当 scan 为 true 时,此属性生效。默认的时间间隔为1
分钟。-
debug
:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false。
用来定义变量值的标签,有两个属性,name
和 value
;其中 name 的值是变量的名称,value 的值是变量定义的值。通过定义的值会被插入到 logger 上下文中。定义变量后,可以使 ${}
来使用变量。
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
这段配置用于引用 Spring 上下文的变量。通过这段配置,我们可以在 logback 配置文件中使用 ${springAppName}
来引用配置文件 application.yml 里的 spring.application.name
配置值,例如在 bntang-server-system 模块中,则该值为 bntang-server-system
。
<property name="log.path" value="log/bntang" />
上面这段配置定义了 log.path
变量,用于指定日志文件的存储路径。
<property name="log.maxHistory" value="15" />
上面这段配置定义了 log.maxHistory
变量,用于指定日志文件存储的天数,这里指定为 15 天。
<property name="log.colorPattern" value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %boldCyan([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]) %yellow(%thread) %green(%logger) %msg%n"/>
这段配置定义了 彩色
日志打印的格式。在 logback 配置文件中,我们可以使用 %magenta()
、%boldCyan()
等标识指定日志的颜色;%d{yyyy-MM-dd HH:mm:ss}
用于格式化日志的打印时间;%highlight(%-5level)
配置了不同日志级别使用不同的颜色高亮显示;%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}
用于打印 Spring Cloud Sleuth 提供的 TraceId
和 SpanId
等信息,如果不配置这些信息,Zipkin Server 就无法追踪我们的请求链了。
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level [${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] %thread %logger %msg%n"/>
这段配置定义了普通日志打印格式,大体上和上面彩色日志配置差不多,区别就是去掉了颜色配置。
如果微服务项目没有使用 Spring Cloud Sleuth
进行请求追踪,那么 TraceId
和 SpanId
打印出来都是空的,可以用下面这段配置来替代:
<property name="log.colorPattern" value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %yellow(%thread) %green(%logger) %msg%n"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level %thread %logger %msg%n"/>
appender 用来格式化日志的输出节点,有俩个属性 name
和 class
,class 用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.colorPattern}</pattern>
</encoder>
</appender>
上面这段配置用于指定日志输出到控制台,日志打印格式采用上面定义的彩色日志打印(IDEA 控制台支持彩色日志输出)这样在开发的时候,控制台输出的日志会更为美观,易于分析问题。
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<MaxHistory>${log.maxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
这两段配置用于指定日志文件输出到存储的地址。其中,名称为 file_info
的 appender
指定了 INFO
级别的日志输出到 log/bntang/info
目录下,文件名称为 info.日期.log
,并且日志格式为普通格式,因为文件一般不支持彩色显示;名称为 file_error
的 appender
指定了 ERROR
级别的日志输出到 log/bntang/error
目录下,文件名称为 error.日期.log
,日志格式也为普通格式。
root 节点是必选节点,用来指定最基础的日志输出级别,只有一个 level
属性,用来设置打印级别。如果在 appender
里制定了日志打印的级别,那么 root 指定的级别将会被 appender
里制定了日志打印的级别覆盖。
编写好日志配置文件后,在启动各个微服务系统的时候,控制台输出如下所示:
在你的 根
模块下,你将会看到保存好的日志文件,就不贴图了。