SpringBoot 日志 logback-spring.xml 配置技巧:使用 springProfile 分环境打印日志到不同目标

使用 SpringBoot 开发项目,日志一般使用 logback,配置文件默认名字就是:logback-spring.xml。

所有日志配置都有个基本的诉求:不同环境输出到不同目标。比如,开发环境输出到控制台,方便在 IDEA、Eclipse 等 IDE 里直接查看;测试、生产环境则输出到日志文件。

这时 logback-spring.xml 配置文件就需要根据环境配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 minutes" debug="false"><!-- 支持日志级别热修改 -->

<property name="PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss SSS}] [%X] [%-5p] %logger{0}.%M\\(%L\\) - %msg%n" />

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>

<springProfile name="stg,prd">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>springboot-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<MaxHistory>100</MaxHistory>
<maxFileSize>50MB</maxFileSize>
</rollingPolicy>

<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
</springProfile>

<!-- Dev 环境输出到控制台,Stg、Prd 输出到文件。 -->
<root level="info">
<springProfile name="dev">
<appender-ref ref="CONSOLE" />
</springProfile>
<springProfile name="stg,prd">
<appender-ref ref="FILE" />
</springProfile>
</root>
</configuration>

配置里的 springProfile 对应的就是 application.properties 文件中的 spring.profiles.active 配置项。

1
2
# 环境类型,开发环境:dev,测试环境:stg,生产环境:prd。
spring.profiles.active=dev

另外注意:

为什么打印到 FILE 的 appender 配置要用 springProfile 标签包起来?

这是因为如果打印到 FILE 的 appender 像 CONSOLE appender 一样直接定义的话,在开发环境时,虽然不会将日志打印到文件,但是还是会生成日志文件,只不过里面是空内容,这是我们不希望看到的。所以需要用 springProfile 标签包起来,这样在测试、生产才打开功能。