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,下面的依赖为你添加日志记录:

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

    Spring Boot有一个LoggingSystem抽象概念(abstraction),它尝试基于classpath的内容配置日志。如果Logback可用,它是第一选择。

    如果你对日志需要做的改变只是设置不同的日志器(logger)的级别,你可以使用‘logging.level’prefix前缀在application.properties中这么做,如下所示:

    1. logging.level.org.springframework.web=DEBUG
    2. 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提供一个默认的基础配置,如果你想设置等级,你可以包含它,如下所示:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration>
    3. <include resource="org/springframework/boot/logging/logback/base.xml"/>
    4. <logger name="org.springframework.web" level="DEBUG"/>
    5. </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,如下所示:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration>
    3. <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    4. <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    5. <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    6. <root level="INFO">
    7. <appender-ref ref="FILE" />
    8. </root>
    9. </configuration>

    你也需要为你的application.properties添加logging.file,如下所示:

    1. 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中设置启动器:

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-web</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>org.springframework.boot</groupId>
    7. <artifactId>spring-boot-starter</artifactId>
    8. <exclusions>
    9. <exclusion>
    10. <groupId>org.springframework.boot</groupId>
    11. <artifactId>spring-boot-starter-logging</artifactId>
    12. </exclusion>
    13. </exclusions>
    14. </dependency>
    15. <dependency>
    16. <groupId>org.springframework.boot</groupId>
    17. <artifactId>spring-boot-starter-log4j2</artifactId>
    18. </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