如何打开Spring WebFlux的访问日志?

hon*_*wei 8 java spring spring-webflux

对于在Netty上运行的Spring WebFlux,我希望有像Tomcat一样的访问日志,但我在Spring文档中找不到任何内容.

有人可以帮忙吗?

Ada*_*lik 6

这Netty中v0.7.9.RELEASE下得到落实这个问题。根据此处发布的说明,您可以启用日志,以便:

  • 使用-Dreactor.netty.http.server.accessLogEnabled=true系统属性运行您的应用程序

和

  • 启用的INFO日志记录 reactor.netty.http.server.AccessLog

请注意,目前仅支持CLF。

在实现该功能之前可用的其他解决方案例如:

电汇日志

作为@GreyTeardrop注释中,你可以设置的日志级别reactor.ipc.netty.channel.ContextHandler和reactor.ipc.netty.http.server.HttpServer到DEBUG。这将以十六进制+ ASCII表的形式对每个消息进行多行转储。在生产中使用并不太令人满意,但是对于调试很有用。

Spring Actuator HTTP跟踪

如果您的项目中装有Spring Actuator,则支持跟踪HTTP请求。跟踪信息被发送到HttpTraceRepositorybean。默认情况下,它InMemoryHttpTraceRepository是可保存最后100条痕迹的。

您可以通过实现自己的HttpTraceRepository或装饰器来利用它,这将添加跟踪记录。您需要将其注册为Bean,它将替换自动配置的Bean InMemoryHttpTraceRepository。

请注意,HTTP跟踪仅具有关于请求和响应的有限信息集,例如。您无权访问请求/响应的正文或大小。

我最终实现的解决方案如下所示:

@Bean
public HttpTraceRepository httpTraceRepository() {
    return new AccessLoggingHttpTraceRepositoryDecorator(
            new InMemoryHttpTraceRepository(),
            LoggerFactory.getLogger("netty.Access"),
            new HttpTraceLogFormatter()
    );
}

public class AccessLoggingHttpTraceRepositoryDecorator implements HttpTraceRepository {

    private HttpTraceRepository delegate;
    private Logger logger;
    private HttpTraceLogFormatter formatter;

    public AccessLoggingHttpTraceRepositoryDecorator(HttpTraceRepository delegate, Logger logger, HttpTraceLogFormatter formatter) {
        this.delegate = delegate;
        this.logger = logger;
        this.formatter = formatter;
    }

    @Override
    public List<HttpTrace> findAll() {
        return delegate.findAll();
    }

    @Override
    public void add(HttpTrace trace) {
        if (logger.isDebugEnabled()) {
            try {
                logger.debug(formatter.format(trace));
            } catch (Exception e) {
                logger.error("Failed to log trace " + trace, e);
            }
        }
        delegate.add(trace);
    }
}

public class HttpTraceLogFormatter {
    public String format(HttpTrace trace) {
        // TODO implement this according to your preference
        return ...;
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方法,您可以获得几乎通用的日志格式消息。

您可能需要application.yml通过指定以下内容来调整跟踪对象中包含的内容

management:
  trace:
    http:
      include: REQUEST_HEADERS, RESPONSE_HEADERS, PRINCIPAL, REMOTE_ADDRESS, TIME_TAKEN
Run Code Online (Sandbox Code Playgroud)

默认情况下仅REQUEST_HEADERS, RESPONSE_HEADERS, COOKIE_HEADERS, TIME_TAKEN包括在内。

您自己的访问日志WebFilter

Spring Boot Actuator在的帮助下实现了跟踪HttpTraceWebFilter。如果您不想使用Actuator的解决方案,则可以从的源代码中汲取灵感HttpTraceWebFilter并实现自己的WebFilter。将其公开为Spring bean,它将自动在Netty中注册。