如何在Spring Boot中输出日志
使用Spring Boot输出日志的方法
解释的目的是什么?
学习并深入理解在Spring Boot中输出日志的步骤。
实现
将日志输出配置集成到本地环境的Spring Boot应用中,并将日志同时输出到标准输出和文件中。使用Logback作为用于输出日志的SLF4J实现库。
技术背景 (jì shù
SLF4J(Simple Logging Facade for Java)是什么?
SLF4J(Simple Logging Facade for Java)是一种用于Java应用程序的开源日志记录框架。SLF4J将与Java日志记录相关的API抽象化,使得可以以不依赖于任何特定日志记录框架的方式编写应用程序代码。换句话说,应用程序可以在不依赖于多个日志记录框架的情况下使用日志记录功能。
Logback是SLF4J API的一个实现后端之一。也就是说,可以在使用SLF4J API输出日志的应用程序中使用Logback作为后端。Logback是一个快速而灵活,提供许多功能的日志记录框架,结合SLF4J使用可以保持一致性的日志记录。
因此,SLF4J和Logback通常一起使用来改善应用程序的日志记录功能,并且通过组合使用,可以提供灵活性,性能以及一致性的日志输出。
软件开发环境
-
- Windows 11 Home 22H2 を使用しています。
WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
> wsl –version
WSL版本:1.0.3.0
内核版本:5.15.79.1
WSLg版本:1.0.47Ubuntu
$ lsb_release -a
没有可用的LSB模块。
发行商ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
版本:22.04
Java JDK ※ 最小配置Java JDK的安装和Hello World!
$ java -version
openjdk版本”11.0.17″ 2022-10-18
OpenJDK运行时环境(构建11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64位服务器VM(构建11.0.17+8-post-Ubuntu-1ubuntu222.04,混合模式,共享)
Maven ※ 最小配置Maven的安装和Hello World!
$ mvn -version
Apache Maven 3.6.3
Maven主目录:/usr/share/maven
Java版本:11.0.17,供应商:Ubuntu,运行时:/usr/lib/jvm/java-11-openjdk-amd64
在这篇文章中,我们主要使用Ubuntu终端进行操作。
输出日志的步骤 de
创建一个最小限的Spring Boot应用程序。
$ cd ~
$ mkdir -p tmp/hello-spring-log
$ cd ~/tmp/hello-spring-log
※ 将~/tmp/hello-spring-log作为项目文件夹。
创建应用程序类
※ 为了简化配置,写出了所有元素。
$ mkdir -p src/main/java/com/example/spring
$ vim src/main/java/com/example/spring/SpringbootApplication.java
文件内容
SpringbootApplication.java
package com.example.spring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
@GetMapping(“/hello”)
public String hello() {
return “Hello World!”;
}
}
创建pom.xml
$ vim pom.xml
文件内容
pom.xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.7.8
com.example
hello-spring-log
1.0
hello-spring-log
11
UTF-8
org.springframework.boot
spring-boot-starter-web
app
org.springframework.boot
spring-boot-maven-plugin
运行Spring Boot应用
构建Java应用
$ mvn clean install
启动Java应用(使用Ctrl + C停止)
$ mvn spring-boot:run
通过另一个终端窗口使用命令进行确认
$ curl http://localhost:8080/hello
Hello World!
从Spring Boot应用中获取到了”Hello World!”。
添加处理日志的库
我将编辑pom.xml文件。
$ vim pom.xml
文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>hello-spring-log</artifactId>
<version>1.0</version>
<name>hello-spring-log</name>
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Log -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
※選抜された部分の一部
ch.qos.logback
logback-core
1.2.6
ch.qos.logback
logback-classic
1.2.6
org.slf4j
slf4j-api
1.7.30
如果使用 LogBack,通常需要包括 logback-core 和 logback-classic 这两个依赖项。这些依赖包含日志记录功能和 SLF4J(Java的简单日志门面)的实现。因此,logback-classic 依赖于 SLF4J,而 logback-core 则依赖于 logback-classic。
创建Spring Boot配置文件
$ mkdir -p src/main/resources
$ vim src/main/resources/application.properties
文件的内容 de
spring.profiles.active=develop
spring.profiles.active是Spring Boot应用程序中用于设置配置文件的属性之一。该属性用于指定在应用程序启动时要激活的配置文件。
例如,develop配置文件可能包含在开发时非常有用的功能和将日志级别设置为DEBUG的配置。另一方面,也可以指定适用于生产环境操作的production配置文件。(Translation may vary.)
添加日志设置文件
在Spring Boot应用程序中,默认会自动加载位于src/main/resources目录下的logback-spring.xml文件。
创建logback-spring.xml.
$ vim src/main/resources/logback-spring.xml
文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProfile name="develop">
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%-5le] %lo{0}.%M:%L - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./log/app.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./log/app.%d{yyyy-MM-dd}_%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>31</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%-5le] [%t] %C.%M:%L - %m%n</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="INFO" />
<logger name="com.example" level="DEBUG" />
<root level="WARN">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</springProfile>
</configuration>
这个配置文件包含了Spring Boot日志的默认配置文件。
官方的Spring Boot日志默认配置
logback-spring.xml 选定部分
[%-5le] %lo{0}.%M:%L – %msg%n
这个配置指定了日志输出的格式。
表达
意义
%le
日志事件的级别
%lo
日志名称
%M
方法名称
%L
行号
%msg
日志消息主体
%n
换行
logback-spring.xml
%date{yyyy-MM-dd HH:mm:ss.SSS} [%-5le] [%t] %C.%M:%L – %m%n
这个配置指定了日志输出的格式。
表达
意义
%date{yyyy-MM-dd HHss.SSS}
以指定的格式显示记录输出的日期和时间。
%-5le
在5个字符的宽度中显示日志级别。%-5是用于指定左对齐的标志。
%t
显示记录输出的线程名称。
%C.%M:%L
显示记录输出的类、方法和行号。
%m
显示日志消息。
%n
插入换行。
logback-spring.xml 选定部分
./log/app.%d{yyyy-MM-dd}_%i.log.gz
5MB
31
true
这个配置指定了按时间间隔进行日志文件的轮转方式。
日志文件名根据 ./log/app.%d{yyyy-MM-dd}_%i.log.gz 文件名模式命名。
同时使用 SizeAndTimeBasedFNATP 类来设置基于文件大小和时间的轮转。
日志文件的最大大小设定为5MB,并使用maxHistory属性设置日志文件的最大保存天数为31天。
cleanHistoryOnStart属性设置是否在应用启动时自动删除旧的日志文件。
在Java代码中添加输出日志的代码
$ vim src/main/java/com/example/spring/SpringbootApplication.java
文件的内容 de
package com.example.spring;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class SpringbootApplication {
private static final Logger log = LoggerFactory.getLogger(SpringbootApplication.class);
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
@GetMapping("/hello")
public String hello() {
log.info("Hello World!");
return "Hello World!";
}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
我们导入了使用SLF4J输出Java日志所需的类和接口。
SpringbootApplication.java ※摘录部分
private static final Logger log = LoggerFactory.getLogger(SpringbootApplication.class);
LoggerFactory.getLogger()方法需要传入使用日志功能的类的名称。通常情况下,我们会根据类来定义日志记录器,所以需要指定完全限定名。这个日志记录器对象将通过SLF4J来实现日志输出。
SpringbootApplication.java ※摘录部分
log.info(“Hello World!”);
我们使用SLF4J的Logger接口的info()方法来向日志输出信息”Hello World!”。
SLF4J的日志级别
级别
概览
TRACE
用于调试的非常详细的信息
DEBUG
调试信息
INFO
一般信息
WARN
警告信息
ERROR
错误信息
FATAL
致命错误
目录文件结构
$ tree -I log -I target
.
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── example
│ └── spring
│ └── SpringbootApplication.java
└── resources
├── application.properties
└── logback-spring.xml
运行Spring Boot应用
Java 应用程序构建
$ mvn clean install
使用Java启动应用程序(按Ctrl + C停止)
$ mvn spring-boot:run
请使用其他终端命令进行确认。
$ curl http://localhost:8080/hello
Hello World!
在终端上显示了以下日志信息。
[INFO ] SpringbootApplication.hello:23 - Hello World!
另外,以下内容已在/log/app.log中记录。
2023-02-21 17:25:33.785 [INFO ] [http-nio-8080-exec-1] com.example.spring.SpringbootApplication.hello:23 - Hello World!
设置异步输出日志
控制当队列已满时是否阻塞日志事件的处理。如果此值为 true,在队列已满的情况下,不会阻塞日志事件并且会丢弃。如果为 false,在队列已满的情况下,会阻塞日志事件。
是用于配置 Logback 的日志事件是否包含调用者数据(caller data)的设置。调用者数据指的是指示日志事件发生位置(类名、方法名、行号)的信息。通过启用此设置,可以将调用者数据包含在日志事件中。然而,从性能方面考虑,在使用异步 appender 时需要注意此设置。
简要总结
- Ubuntu の 最小構成の Java 開発環境で Spring Boot アプリにログ出力機能を組みこむことが出来ました。