Nettyで実行されているSpringWebFluxの場合、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.ContextHandler
とreactor.ipc.netty.http.server.HttpServer
のログレベルをDEBUG
に設定できます。これにより、各メッセージの複数行のダンプが16進数+ ASCIIテーブルとして生成されます。本番環境での使用には必ずしも適していませんが、デバッグには役立ちます。
プロジェクトにSpringActuatorがある場合、サポートされています HTTPリクエストのトレース 。トレース情報はHttpTraceRepository
Beanに送信されます。デフォルトでは、最後の100個のトレースを保持するのはInMemoryHttpTraceRepository
です。
独自の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 ...;
}
}
このアプローチでは、ほぼ Common Log Format メッセージを受け取ることができます。
トレースオブジェクトに含まれるものを指定して、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に自動的に登録されます。
Adam Michalik からの優れた答えを拡張して、JVM引数-Dreactor.netty.http.server.accessLogEnabled=true
をロガーreactor.netty.http.server.AccessLog
と一緒に使用すると、グリニッジでは機能しましたが、フィンチリーでは機能しませんでした。
私はSpringCloud Gateway v2.1.2を使用しているので、 Spring Cloud のRelease Trainsセクションを考慮するとこれは理にかなっていると思います。
ReactorNettyの最新バージョンにアクセスログのサポートが追加されました。 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
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>