使用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记录访问日志的启动器。

广告
将在 10 秒后关闭
bannerAds