使用Spring Boot框架将内嵌Tomcat的访问日志输出到标准输出
简要说明
在Spring Boot的嵌入Tomcat中,可以自动将访问日志输出到文件中。
本文将介绍将其输出到标准输出的方法。
环境
-
- Java8
-
- Gradle 5.6.2
-
- Spring Boot 2.2.1
-
- logback-access 1.2.3
- logback-access-spring-boot-starter 2.7.1
首先,输出访问日志。
我将编写一个可以接收任意的GET和POST请求的RestController。
(Paraphrased in Chinese)
@RequestMapping("hello")
@RestController
public class HelloController {
@GetMapping("")
public String hello() {
return "Hello, world!";
}
@PostMapping("")
public String message(@RequestBody String message) {
return "Hello, " + message + "!";
}
}
您可以通过在application.properties文件中添加以下配置来输出访问日志。
server.tomcat.accesslog.enabled=true
server.tomcat.basedir=/path/to/dir
server.tomcat.accesslog.directory=logs
server.tomcat.accesslog.suffix=.log
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.file-date-format=.yyyy-MM-dd
当真的在本地尝试执行,产生了一个访问日志文件,路径为 /path/to/dir/logs/access_log.yyyy-MM-dd.log。
$ curl localhost:8080/hello
Hello, world!
curl -H "Content-Type: text/plain" localhost:8080/hello -d "mito"
Hello, mito!
$ ls /path/to/dir/logs
access_log.2019-11-08.log
$ cat /path/to/dir/logs/access_log.2019-11-08.log
0:0:0:0:0:0:0:1 - - [08/Nov/2019:17:59:56 +0900] "GET /hello HTTP/1.1" 200 13
0:0:0:0:0:0:0:1 - - [08/Nov/2019:18:00:01 +0900] "POST /hello HTTP/1.1" 200 16
将访问日志输出到标准输出
正如Twelve-Factor App所提到的,现代应用程序通常将日志输出到标准输出。
要将输出定向到标准输出,有几种方法可供选择。
将数据输出到/dev/stdout。
可以通过设置,将输出文件在/dev/stdout上进行输出,以实现标准输出。
server.tomcat.accesslog.enabled=true
server.tomcat.basedir=/dev
server.tomcat.accesslog.directory=stdout
server.tomcat.accesslog.suffix=
server.tomcat.accesslog.prefix=
server.tomcat.accesslog.file-date-format=
使用logback-access
有些情況下,希望盡量避免直接觸碰/dev/stdout。
通過使用logback-access,可以將輸出指向設定為標準輸出。
首先,在src/main/resources/conf/目录下放置logback-access.xml文件。
在logback-access.xml文件中,按照以下方式进行配置,使其将输出到stdout。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- combined log format-->
<pattern>combined</pattern>
</encoder>
</appender>
<appender-ref ref="STDOUT" />
</configuration>
另外,添加logback-access的依赖(以下为gradle的情况),
dependencies {
...
+ implementation group: 'ch.qos.logback', name: 'logback-access', version: '1.2.3'
}
通过创建TomcatServletWebSErverFactory的Bean,将设置应用到内嵌的Tomcat服务器中。
@Configuration
public class TomcatLoggingConfig {
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory();
// LogbackValveはresources以下を参照するため、これでlogback-access.xmlの内容が反映される
tomcatServletWebServerFactory.addContextValves(new LogbackValve());
return tomcatServletWebServerFactory;
}
}
当您启动并尝试发送请求时,可以确认会输出以下日志。
0:0:0:0:0:0:0:1 - - [08/11/2019:18:38:29 +0900] "GET /hello HTTP/1.1" 200 13 "-" "curl/7.54.0"
0:0:0:0:0:0:0:1 - - [08/11/2019:18:38:20 +0900] "POST /hello HTTP/1.1" 200 16 "-" "curl/7.54.0"
不需要配置application.properties文件。
使用logback-access-spring-boot-starter。
使用logback-access-spring-boot-starter可以自动应用上述logback-access的配置。
添加依赖并+
dependencies {
...
+ implementation group: 'net.rakugakibox.spring.boot', name: 'logback-access-spring-boot-starter', version: '2.7.1'
}
将先前的logback-access.xml文件放置在src/main/resources目录下,访问日志将被输出到标准输出。非常方便!
请看以下内容
以下是您所提供链接的中文简介:
https://www.baeldung.com/spring-boot-embedded-tomcat-logs
这篇文章介绍了如何在Spring Boot中使用嵌入式Tomcat记录日志。
http://logback.qos.ch/access.html
这是Logback Access的官方网站,Logback Access是Logback的一个模块,用于记录访问日志。
https://stackoverflow.com/questions/36780680/how-do-you-tell-spring-boot-to-send-the-embedded-tomcats-access-logs-to-stdout?answertab=votes#tab-top
这个问题在Stack Overflow上讨论如何告诉Spring Boot将嵌入式Tomcat的访问日志发送到标准输出(stdout)。
https://github.com/akihyro/logback-access-spring-boot-starter
这是一个开源项目,提供了在Spring Boot中使用Logback Access记录访问日志的启动器。