学习 Spring Boot(五):SLF4J 日志

默认情况下,Spring Boot 使用 Logback 记录日志,从而保证了使用了 Java Util LoggingLog4J2SLF4J 的库也可以正常的工作。

Spring Boot 提供了日志的 Starter,编辑 pom.xml 文件,增加依赖:

<dependency>  
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>  

在 resources 目录下新建 logback-spring.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>  
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>  

完成最基本的配置,就可以在代码中使用 Logger 记录日志了,go go go!!!

Logback

在开始之前,先简单介绍一下 Logback。Logback 是对 SLF4J 的一个加强版的实现,主要由两个库组成:

logback-core Logback 的核心库

logback-classic 原生实现了 SLF4J 的接口(Logback 和 SLF4J 作者是同一人)

Logback 构建在三个主要的组件之上:

  • Logger
  • Appender
  • Layout
Logger

logger 是记录日志的组件

logger 提供了五种日志级别:ERROR > WARN > INFO > DEBUG > TRACE

logger 命名体系,根为 root。其它,“com” 是 “com.dyingbleed” 的父亲,是 root 的孩子

孩子如果没有指定日志级别,会继承父亲的日志级别

Appender

appender 是写入日志的组件

写入日志的目标,可以是控制台、文件、socket 或者 syslog 等

Layout

layout 是格式化日志的组件

配置 logback-spring.xml

由于,标准的 logback.xml 配置加载时间过早,所以,如果要 Spring Boot 的扩展功能,使用 logback-spring.xml 配置文件对 Logback 进行配置

指定 profile 配置

通过 <springProfile> 标签,根据当前激活的 profile,包括或排除不同的配置,例如:

<!-- 非生产环境,日志级别为 DEBUG -->  
<springProfile name="!prod">  
    <logger name="com.dyingbleed">
        <level value="DEBUG"></level>
    </logger>
</springProfile>

<!-- 生产环境,日志级别为 WARN -->  
<springProfile name="prod">  
    <logger name="com.dyingbleed">
        <level value="WARN"></level>
    </logger>
</springProfile>  
环境变量

通过 <springProperty> 标签,获取 application.yml / application.properties 文件中定义的环境变量,例如:

<!-- 定义属性 loggingPath -->  
<springProperty scope="context" name="loggingPath" source="logging.path" defaultValue="/tmp/test.log" />

<!-- 使用属性 loggingPath -->  
<appender name="FILE" class="ch.qos.logback.core.FileAppender">  
        <file>${loggingPath}</file>
        <encoder>
            <pattern>%date [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

记录日志

首先,通过 LoggerFactory 工厂类创建一个 Logger 实例:

@RestController
@RequestMapping("/v1/users")
public class UserController {

    private final static Logger logger = LoggerFactory.getLogger(UserController.class);

    // do something...

}

然后,使用 logger 记录不同日志级别的日志:

@RequestMapping(method = RequestMethod.GET)
public List<User> queryAllUsers() {  
    logger.debug("调用方法 queryAllUsers()");
    List<User> result = this.userService.queryAllUsers();
    logger.debug("方法 queryAllUsers() 返回 {}", result);
    return result;
}

注意 logger.debug("方法 queryAllUsers() 返回 {}", result),实现了类似“插值”的功能,字符串中的 {}将被替换为了 result