对于在Netty上运行的Spring WebFlux,我想拥有像Tomcat一样的访问日志,但我在Spring documentation中找不到任何内容。
有人可以帮忙吗?
答案 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.ContextHandler
和reactor.ipc.netty.http.server.HttpServer
的日志级别设置为DEBUG
。这将以十六进制+ ASCII表的形式对每个消息进行多行转储。在生产中使用并不太令人满意,但是对于调试很有用。
如果您的项目中装有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
。
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 部分,我认为这很有意义。