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

时间:2017-11-03 08:52:02

标签: java spring spring-webflux

对于在Netty上运行的Spring WebFlux,我想拥有像Tomcat一样的访问日志,但我在Spring documentation中找不到任何内容。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

这已在this issue之后的Netty v0.7.9.RELEASE中实现。根据{{​​3}}发布的说明,您可以启用日志,以便:

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

AND

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

请注意,目前仅支持here

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

电汇日志

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

Spring Actuator HTTP跟踪

如果您的项目中装有Spring Actuator,则支持CLF。跟踪信息被发送到HttpTraceRepository bean。默认情况下,它是InMemoryHttpTraceRepository,其中包含最后100条痕迹。

您可以通过实现自己的HttpTraceRepository或将其添加到日志记录的装饰器来利用它。您需要将其注册为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 ...;
    }
}

通过这种方法,您可以获得近tracing of HTTP requests条消息。

您可能需要通过指定

来调整application.yml中跟踪对象中包含的内容
management:
  trace:
    http:
      include: REQUEST_HEADERS, RESPONSE_HEADERS, PRINCIPAL, REMOTE_ADDRESS, TIME_TAKEN

默认情况下,仅包含REQUEST_HEADERS, RESPONSE_HEADERS, COOKIE_HEADERS, TIME_TAKEN

您自己的访问日志WebFilter

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

答案 1 :(得分:1)

对访问日志的支持已添加到最新版本的Reactor Netty中。 只需将您的Reactor版本更新为<reactor-bom.version>Bismuth-SR11</reactor-bom.version> 然后,您只需要使用任何使用的日志记录框架就可以将reactor.netty.http.server.AccessLog登录到access_log.log

有关详情,请参见此处:https://github.com/reactor/reactor-netty/issues/301#issuecomment-418402375

答案 2 :(得分:1)

使用Java系统属性启用网域访问日志,

axis:x

,您可以将日志记录系统配置为具有单独的访问日志文件。

下面是一个log4j2配置示例。

-Dreactor.netty.http.server.accessLogEnabled=true
 <RollingRandomAccessFile name="ACCESS_LOG" fileName="access.log"
                                 filePattern="$${date:yyyy-MM}/access-%d{MM-dd-yyyy}-%i.log.gz"
                                 append="true">
            <PatternLayout pattern="[%t] %d{dd MM yyyy HH:mm:ss,SSS} %-5p %-15c{1} [%X]: %m%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="5 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="4"/>
        </RollingRandomAccessFile>

答案 3 :(得分:1)

在扩展Adam Michalik的出色回答时,我只想提到,格林威治对JVM的使用-Dreactor.netty.http.server.accessLogEnabled=true和记录器reactor.netty.http.server.AccessLog的使用对我来说是有效的,但对Finchley却不起作用。

我正在使用Spring Cloud Gateway v2.1.2,因此考虑到Spring Cloud Release Trains 部分,我认为这很有意义。