使用Spring Boot和logback-access来输出Tomcat的访问日志

在Spring Boot中,如果要输出Tomcat的访问日志,可以使用server.tomcat.accesslog.*属性,但如果使用这个属性还不够的话,可以使用logback-access。配置起来很简单,只需添加logback-access-spring-boot-starter的依赖即可。在这里,我将记录下不使用这个starter而实现相同配置的方法。实际上内部执行的操作和使用starter是等效的。

首先,添加logback-access的依赖。

plugins {
  id 'java'
  id 'org.springframework.boot' version '3.0.5'
  id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'

  implementation 'ch.qos.logback:logback-access'
}

tasks.named('test') {
  useJUnitPlatform()
}

添加logback-access的配置如下。 logback配置文件用于访问日志,详情请见后文,默认文件名为conf/logback-access.xml,可以根据以下注释行进行更改。

import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import ch.qos.logback.access.tomcat.LogbackValve;

@Configuration
public class LogbackAccessConfig {

  @Bean
  public WebServerFactoryCustomizer<ConfigurableTomcatWebServerFactory> webServerFactoryCustomizer() {
    return (factory) -> {
      LogbackValve v = new LogbackValve();
      // v.setFilename(new ClassPathResource("logback-access.xml").getPath());
      factory.addEngineValves(v);
    };
  }
}

将用于访问日志的配置文件放置在 src/main/resources/conf/logback-access.xml 文件中。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <Pattern>combined</Pattern>
      <Pattern>[ACCESS] %h %l %u %r %t{yyyy-MM-dd HH:mm:ss.SSS} %s %b %D ms</Pattern>
    </encoder>
  </appender>

  <appender-ref ref="STDOUT" />
</configuration>

这样做将会显示以下的访问日志。

[ACCESS] 0:0:0:0:0:0:0:1 - - GET /hoge HTTP/1.1 2023-04-11 18:23:05.002 404 275 24 ms
广告
将在 10 秒后关闭
bannerAds