Reactor Netty 访问日志 (Reactor Netty Access Logs)
要启用 Reactor Netty 的访问日志,请设置 Java 系统属性:-Dreactor.netty.http.server.accessLogEnabled=true。
重要
这必须是一个 Java 系统属性(System Property),而不是 Spring Boot 的属性(即不能写在 application.yml 中)。
你可以将日志系统配置为使用单独的访问日志文件。以下示例展示了如何创建 Logback 配置:
logback.xml
<appender name="accessLog" class="ch.qos.logback.core.FileAppender">
<file>access_log.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="accessLog" />
</appender>
<logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
<appender-ref ref="async"/>
</logger>补充教学 —— 深入理解网关访问日志
1. 为什么要开启访问日志? 网关作为所有流量的入口,记录“谁在什么时候访问了什么路径、状态码是多少、耗时多久”是非常关键的。这对于故障排查、流量分析、安全审计至关重要。
2. 为什么 application.yml 里配置无效? Spring Cloud Gateway 基于 Reactor Netty 构建。访问日志的开关属于 Netty 层的底层逻辑,它在 Spring 上下文初始化之前就需要生效。因此,你必须通过 JVM 参数启动:
- 命令行启动:
java -Dreactor.netty.http.server.accessLogEnabled=true -jar gateway.jar - IDEA 调试:在
VM options中添加。 - Docker 部署:在环境变量
JAVA_OPTS中添加。
3. 日志格式说明 默认情况下,Reactor Netty 使用经典的控制台输出。如果你按照上面的 Logback 配置,日志内容会类似于: 127.0.0.1 - - [01/Jan/2024:12:00:00 +0800] "GET /user/login HTTP/1.1" 200 125 45
200:状态码125:响应体字节数45:处理耗时(毫秒)
4. 性能优化建议 示例配置中使用了 AsyncAppender。强烈建议在生产环境使用异步日志。由于网关请求量巨大,如果使用同步日志,磁盘 I/O 的阻塞会直接拖慢网关的响应速度(即增加系统的 RT),甚至导致网关在高并发下假死。
5. 进阶:Logstash 集成 如果你使用 ELK(Elasticsearch, Logstash, Kibana)全家桶,可以将 accessLog appender 修改为 LogstashTcpSocketAppender,直接将结构化日志推送到分析平台。