繁体   English   中英

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

[英]How to turn on the access log for Spring WebFlux?

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

任何人都可以帮忙吗?

这已在此问题之后的 Netty v0.7.9.RELEASE 中实现。 根据此处发布的说明您可以启用日志,以便:

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

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

请注意,目前仅支持CLF

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

电线日志

作为@GreyTeardrop注释中,你可以设置的日志级别reactor.ipc.netty.channel.ContextHandlerreactor.ipc.netty.http.server.HttpServerDEBUG 这将生成每条消息的多行转储作为十六进制 + ASCII 表。 对生产使用来说不是很愉快,但对调试很有用。

Spring Actuator HTTP 跟踪

如果您的项目中有 Spring Actuator,则支持跟踪 HTTP 请求 跟踪信息被发送到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 ...;
    }
}

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

您可能需要在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 在HttpTraceWebFilter的帮助下实现跟踪。 如果你不想使用执行器的解决方案,您可能需要从源代码灵感HttpTraceWebFilter和实现自己的WebFilter 将其作为 Spring bean 公开,它将自动注册到 Netty。

最新版本的 Reactor Netty 中添加了对访问日志的支持。 只要更新您堆版<reactor-bom.version>Bismuth-SR11</reactor-bom.version>然后你只需要启用日志记录reactor.netty.http.server.AccessLogaccess_log.log使用任何日志框架你正在使用。

详情请看这里: https : //github.com/reactor/reactor-netty/issues/301#issuecomment-418402375

使用 Java System Property 启用 netty 访问日志,

-Dreactor.netty.http.server.accessLogEnabled=true

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

下面是一个示例 log4j2 配置。

 <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>
 <logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
            <AppenderRef ref="ACCESS_LOG"/>
        </logger>

从扩展的出色答卷亚当·米哈利克,我只是想提一提,使用JVM参数-Dreactor.netty.http.server.accessLogEnabled=true与记录仪一起reactor.netty.http.server.AccessLog格林威治但不是为我工作与芬奇利。

我使用的是 Spring Cloud Gateway v2.1.2,所以考虑到Spring CloudRelease Trains部分,我想这是有道理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM