Spring Boot 内部所有的日志记录都是通过使用 Commons Logging 实现,同时默认配置也提供了 Java Util Logging、Log4J、Log4J2、Logback 的支持。每种日志都预配置可以使用控制台输出和文件输出。
Spring Boot 日志由启动器spring-boot-starter-logging来解决:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>

你不必显式的声明此依赖。默认情况下,Spring Boot 使用 Logback 进行日志记录。

1. 日志级别

在 Spring Boot 中,通过logging.level.*=TRACE/DEBUG/INFO/WARN/ERROR/FATAL/OFF来设置日志的级别。*可以是根级别(root)也可以是包级别。

application.properties 配置示例:

1
2
3
logging.level.root = WARN
logging.level.org.springframework = INFO
logging.level.org.hibernate.SQL = DEBUG

application.yml 配置示例:

1
2
3
4
5
logging:
level:
root: WARN
org.springframework: INFO
org.hibernate.SQL: DEBUG

2. 文件输出

默认情况下,Spring Boot 只将日志信息显示到控制台。如果你想要将日志信息输出到外部文件,你可以使用logging.filelogging.path属性来配置。日志文件大小达到 10M 时,将产生一个新的文件。

  • 使用logging.file可以设置日志输出的文件
    • 文件相对路径(相对项目的根目录):logfile.loglogs/logfile.log
    • 文件绝对路径:/pathname/logfile.log

application.properties 配置示例:

1
logging.file = logs/logfile.log

application.yml 配置示例:

1
2
logging:
file: logs/logfile.log
  • 使用logging.path可以设置日志输出的目录,spring.log日志文件将输出到该目录
    • 目录相对路径(相对项目的根目录):logspathname/logs
    • 目录绝对路径:/pathname/logs

application.properties 配置示例:

1
logging.path = logs

application.yml 配置示例:

1
2
logging:
path: logs

3. 日志格式

Spring Boot 默认输出的日志信息格式:

1
2
2017-07-09 11:47:06.599 INFO 10252 --- [main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2017-07-09 11:47:06.632 INFO 10252 --- [main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)

它由以下几个部分组成:

  • 精确到毫秒的日期和时间
  • 日志级别(TRACE<br>DEBUG<br>INFO<br>WARN<br>ERROR
  • 进程 ID
  • 分隔符---
  • 线程名称,包裹在[]
  • 日志名称,通常是类的完全限定路径的简写
  • 分隔符:
  • 日志消息

使用logging.pattern.console(只支持logback)可以自定义控制台日志输出格式。

application.properties 配置示例:

1
logging.pattern.console="%date{yyyy-MM-dd HH:mm:ss} -%5level [%15.15thread] %-40.40logger{39} : %msg%n"

application.yml 配置示例:

1
2
3
logging:
pattern:
console: "%date{yyyy-MM-dd HH:mm:ss} -%5level [%15.15thread] %-40.40logger{39} : %msg%n"

使用logging.pattern.file(只支持logback)可以自定义文件的日志输出格式。

application.properties 配置示例:

1
logging.pattern.file="%date{yyyy-MM-dd HH:mm:ss.SSS} -%5level [%15.15thread] %-40.40logger{39} : %msg%n"

application.yml 配置示例:

1
2
3
logging:
pattern:
file: "%date{yyyy-MM-dd HH:mm:ss.SSS} -%5level [%15.15thread] %-40.40logger{39} : %msg%n"

常用的日志信息格式化参数:

参数 描述
%c{length}
%logger{length}
输出所属的类目,通常就是所在类的全名
%d{pattern}
%date{pattern}
输出日志的日期或时间
%F
%file
输出发出日志记录请求的Java源文件的文件名
%L
%line
输出日志事件的发生行号信息
%m
%msg
%message
输出程序代码中指定的消息
%p
%le
%level
输出日志级别信息
%t
%thread
输出产生该日志事件的线程名
%n 输出一个平台的回车换行符

其中 %logger{length},如果信息长度大于给定的 length 的值,保留最右边的单词,左边的每个单词只保留第一个字符。

示例 信息 结果
%logger org.fanlychie.DemoService org.fanlychie.DemoService
%logger{0} org.fanlychie.DemoService DemoService
%logger{10} org.fanlychie.DemoService o.f.DemoService
%logger{24} org.fanlychie.DemoService o.fanlychie.DemoService
%logger{100} org.fanlychie.DemoService org.fanlychie.DemoService

日志信息宽度和对齐方式控制,以%logger为例:

示例 描述
%50logger 右对齐,最小的宽度是50,长度不足50则左补空格,长度超出50则原样输出
%-50logger ‘-‘表示向左对齐,最小的宽度是50,长度不足50则右补空格,长度超出50则原样输出
%.20logger 左对齐,最大的宽度是20,如果长度超出20,将左边多出的字符直接丢掉
%30.50logger 最小宽度是30,如果长度不足30则左补空格右对齐;如果长度超出30且不足50则左对齐;如果长度超出50则将左边多出的字符直接丢掉

4. 扩展 logback

Spring Boot 允许我们通过扩展 Logback 进行更高级的配置。在类路径下创建logback-sprng.xml

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 引用 Spring Boot 的 base.xml 的配置 -->
<!-- spring-boot.jar!\org\springframework\boot\logging\logback\base.xml -->
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!-- 自定义日志级别 -->
<root level="ERROR" />
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.hibernate.SQL" level="DEBUG"/>
</configuration>

4.1 配置文件的加载

Spring Boot 默认从系统类路径加载的日志配置文件:

  • logback-spring.xml
  • logback-spring.groovy
  • logback.xml
  • logback.groovy

单元测试的 DEBUG 日志可以在src/test/resources/logback-test.xml中配置控制。

5. 多环境日志配置

使用<springProfile>标签可以定义不同 profile 环境的配置:

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
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 引用 Spring Boot 的 defaults.xml 的配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定义 LOG_FILE 变量 -->
<!-- 日志文件优先使用 logging.file 的值,如果没有则使用 logging.path 的值,如果还没有则放入临时目录 -->
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
<!-- 自定义日志级别 -->
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.fanlychie" level="DEBUG"/>
<!-- 开发环境日志 -->
<springProfile name="dev">
<!-- 引用 Spring Boot 的 console-appender.xml 的配置 -->
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!-- root 日志级别 -->
<root level="WARN">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<!-- 生产环境日志 -->
<springProfile name="prod">
<!-- 引用 Spring Boot 的 console-appender.xml 的配置 -->
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!-- 自定义文件日志 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!-- 使用默认的日志格式 -->
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 日志文件 -->
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<!-- 如果日志文件超出大小限制, 则以 ${LOG_FILE}.1, ${LOG_FILE}.2... 备份 -->
<fileNamePattern>${LOG_FILE}.%i</fileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<!-- 超出大小限制开启一个新的文件 -->
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- root 日志级别 -->
<root level="WARN">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
</configuration>

application.properties 配置示例:

1
2
spring.profiles.active = dev
logging.file = logs/logfile.log

application.yml 配置示例:

1
2
3
4
5
spring:
profiles:
active: dev
logging:
file: logs/logfile.log

示例项目开发环境:Java-8、Maven-3、IntelliJ IDEA-2017、Spring Boot-1.5.2.RELEASE
完整示例项目链接:spring-boot-logging-sample
参考文档文献链接:logback-docspring-boot-logging