如何在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
相关产品推荐
相关产品推荐

