[英]How to turn on the access log for Spring WebFlux?
这已在此问题之后的 Netty v0.7.9.RELEASE 中实现。 根据此处发布的说明,您可以启用日志,以便:
-Dreactor.netty.http.server.accessLogEnabled=true
系统属性运行您的应用程序和
reactor.netty.http.server.AccessLog
INFO 日志记录请注意,目前仅支持CLF 。
在实现该功能之前可用的其他解决方案是:
作为@GreyTeardrop注释中,你可以设置的日志级别reactor.ipc.netty.channel.ContextHandler
和reactor.ipc.netty.http.server.HttpServer
到DEBUG
。 这将生成每条消息的多行转储作为十六进制 + ASCII 表。 对生产使用来说不是很愉快,但对调试很有用。
如果您的项目中有 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
。
Spring Boot Actuator 在HttpTraceWebFilter
的帮助下实现跟踪。 如果你不想使用执行器的解决方案,您可能需要从源代码灵感HttpTraceWebFilter
和实现自己的WebFilter
。 将其作为 Spring bean 公开,它将自动注册到 Netty。
最新版本的 Reactor Netty 中添加了对访问日志的支持。 只要更新您堆版<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
使用 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 Cloud的Release Trains部分,我想这是有道理的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.