78. 日志
Spring Boot没有强制的(mandatory)日志依赖,除了Commons Logging API,它通常由Spring Framework的spring-jcl
模块提供。要使用Logback,你需要在classpath上包含它和spring-jcl
。那么做的最简单方式是通过启动器,它们都依赖于spring-boot-starter-logging
。对于一个web应用,你只需要spring-boot-starter-web
,因为它依赖日志启动器。如果你使用Maven,下面的依赖为你添加日志记录:
- <dependency>
- <groupId>org.springframework.boot
- <artifactId>spring-boot-starter-web
- </dependency>
Spring Boot有一个LoggingSystem
抽象概念(abstraction),它尝试基于classpath的内容配置日志。如果Logback可用,它是第一选择。
如果你对日志需要做的改变只是设置不同的日志器(logger)的级别,你可以使用‘logging.level’prefix前缀在application.properties
中这么做,如下所示:
- logging.level.org.springframework.web=DEBUG
- logging.level.org.hibernate=ERROR
你也可以设置写入日志(除了console)的文件的位置,使用‘logging.file’。
要配置更细粒度的日志系统设置,你需要使用LoggingSystem
支持的原生的(native)配置格式。默认地,Spring Boot为日志系统从默认位置收集原生配置(如对于Logback是classpath:logback.xml
),但你可以使用‘logging.config’属性设置配置文件的位置。
78.1 为日志记录配置Logback
如果你在classpath根路径下放置一个logback.xml
,它从那里被收集(或者从logback-spring.xml
,为了利用Boot提供的模板特性)。Spring Boot提供一个默认的基础配置,如果你想设置等级,你可以包含它,如下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <include resource="org/springframework/boot/logging/logback/base.xml"/>
- <logger name="org.springframework.web" level="DEBUG"/>
- </configuration>
如果你在Spring Boot jar内查看base.xml
,你会看到它使用了一些有用的系统属性,那些LoggingSystem
为你创建的:
${PID}
:当前进程ID。${LOG_FILE}
:在Boot的额外配置中是否设置了logging.file
。${LOG_PATH}
:在Boot的额外配置中是否设置了logging.path
(代表日志文件存在的目录)。${LOG_EXCEPTION_CONVERSION_WORD}
:在Boot的额外配置中是否设置了logging.exception-conversion-word/code>。
Spring Boot也提供了一些友好的ANSI颜色终端输出在控制台上(但不在日志文件内),通过使用一个定制的Logback转换器。查看默认的base.xml
配置了解细节。
如果Groovy在classpath上,你应该也能够使用logback.groovy
配置Logback。如果出现了,这个设置享有优先权(preference)。
78.1.1 配置Logback仅文件输出
如果你想禁用控制台日志并把输出只写到文件,你需要一个定制的logback-spring.xml
,导入了file-appender.xml
而不是console-appender.xml
,如下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <include resource="org/springframework/boot/logging/logback/defaults.xml" />
- <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
- <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
- <root level="INFO">
- <appender-ref ref="FILE" />
- </root>
- </configuration>
你也需要为你的application.properties
添加logging.file
,如下所示:
- logging.file=myapplication.log
78.2 为日志记录配置Log4j
Spring Boot为日志记录配置支持Log4j 2,如果它在classpath上。如果你为了集成依赖使用了启动器,你不得不去除Logback,然后包含Log4j代替。如果你没有使用启动器,你需要提供(至少)spring-jcl
除了Log4j 2.
最简单的路可能就是通过使用启动器,尽管它要求一些排除(原文:it requires some jiggling with excludes.)。下面的例子展示了如何在Maven中设置启动器:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-logging</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-log4j2</artifactId>
- </dependency>
note:Log4j 启动器为公共日志要求收集依赖在一起(如Tomcat使用java.util.logging
,但使用Log4j配置输出)。See..
note:为了确保使用java.util.logging
执行的debug日志被导航到Log4j 2,配置它的 JDK logging adapter,通过设置java.util.logging.manager
系统属性到org.apache.logging.log4j.jul.LogManager
78.2.1 使用YAML或者JSON配置Log4j 2
除了它的默认XML配置格式,Log4j 2也支持YAML和JSON配置文件。要配置Log4j 2,使用一个二选一的配置文件格式,添加合适的依赖到classpath,命名你的配置文件来匹配你选择的文件格式,如下面例子所示:
Format
Dependencies
File names
YAML
com.fasterxml.jackson.core:jackson-databind
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml
log4j2.yaml
log4j2.yml
JSON
com.fasterxml.jackson.core:jackson-databind
log4j2.json
log4j2.jsn