Skip to content

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

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,直接将结构化日志推送到分析平台。

Based on Spring Framework.