You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Webflux中自定义Reactor访问日志格式?

Spring Webflux 自定义Reactor Netty访问日志实现指引

1. 关闭默认访问日志配置

首先移除或禁用你之前使用的JVM启动参数-Dreactor.netty.http.server.accessLogEnabled=true,默认访问日志的格式是固定的无法自定义,我们会通过编码方式注册自定义的访问日志组件。

2. 添加自定义Netty服务器配置

通过NettyServerCustomizer直接修改Reactor Netty服务器的配置,实现自定义日志格式、指定请求头输出、屏蔽IP地址的需求,示例配置类如下:

import org.springframework.boot.web.embedded.netty.NettyServerCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.netty.http.server.HttpServer;
import io.netty.handler.logging.LogLevel;
import java.util.Arrays;
import java.util.List;

@Configuration
public class CustomAccessLogConfig {
    // 按需调整你要记录的请求头列表
    private static final List<String> REQUIRED_REQUEST_HEADERS = Arrays.asList(
        "User-Agent", "Referer", "X-Request-ID", "X-Custom-Header"
    );

    @Bean
    public NettyServerCustomizer accessLogCustomizer() {
        return httpServer -> httpServer
            .accessLog(true, accessLogSpec -> accessLogSpec
                // 自定义日志格式,不要添加任何IP相关的占位符即可屏蔽IP输出
                .customFormat(buildCustomLogFormat())
                // 按需调整日志输出级别
                .logLevel(LogLevel.INFO)
            );
    }

    private String buildCustomLogFormat() {
        StringBuilder formatBuilder = new StringBuilder();
        // 基础日志字段:请求方法、请求路径、响应状态码、处理耗时(毫秒)、响应体长度
        formatBuilder.append("%m %U %s %D %b");
        // 拼接需要输出的请求头
        for (String header : REQUIRED_REQUEST_HEADERS) {
            formatBuilder.append(" %{").append(header).append("}i");
        }
        return formatBuilder.toString();
    }
}

3. 常用格式占位符说明

你可以根据业务需求调整日志格式中的占位符,常用占位符如下:

  • %m:HTTP请求方法
  • %U:请求URI路径
  • %s:HTTP响应状态码
  • %D:请求处理总耗时,单位为毫秒
  • %b:响应体内容长度
  • %{headerName}i:获取名为headerName的请求头的值,不存在则输出-
  • 注意不要添加%a(远程客户端IP)、%h(远程主机名)这类IP相关的占位符,即可完全去掉IP地址的日志输出

4. 日志级别配置(可选)

如果需要调整访问日志的输出级别,可在application.yml或application.properties中添加如下配置:

logging:
  level:
    # 访问日志对应的日志类,级别按需调整为INFO/DEBUG/ERROR
    reactor.netty.http.server.AccessLog: INFO

注意事项

  • 上述API适用于Spring Boot 2.6+、Reactor Netty 1.0.12+版本,低版本Reactor Netty需使用accessLog(String format, LogLevel level)的重载方法调整格式
  • 如需更复杂的自定义逻辑,比如动态过滤不需要记录的请求、自定义计算字段,可以自定义实现AccessLogArgProvider来完全控制日志输出的内容

内容的提问来源于stack exchange,提问作者Neo123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:06:05