web-dev-qa-db-ja.com

Spring WebFluxのアクセスログをオンにする方法は?

Nettyで実行されているSpringWebFluxの場合、Tomcatのようにアクセスログが必要ですが、 Springドキュメント には何も見つかりません。

誰か助けてもらえますか?

8
hongshuwei

これは、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.HttpServerのログレベルをDEBUGに設定できます。これにより、各メッセージの複数行のダンプが16進数+ ASCIIテーブルとして生成されます。本番環境での使用には必ずしも適していませんが、デバッグには役立ちます。

Spring ActuatorHTTPトレース

プロジェクトにSpringActuatorがある場合、サポートされています HTTPリクエストのトレース 。トレース情報はHttpTraceRepositoryBeanに送信されます。デフォルトでは、最後の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のみが含まれます。

独自のアクセスログWebFilter

Spring Boot Actuatorは、 HttpTraceWebFilter を使用してトレースを実装します。アクチュエータのソリューションを使用したくない場合は、HttpTraceWebFilterのソースコードからインスピレーションを得て、独自のWebFilterを実装することができます。 Spring Beanとして公開すると、Nettyに自動的に登録されます。

6
Adam Michalik

Adam Michalik からの優れた答えを拡張して、JVM引数-Dreactor.netty.http.server.accessLogEnabled=trueをロガーreactor.netty.http.server.AccessLogと一緒に使用すると、グリニッジでは機能しましたが、フィンチリーでは機能しませんでした。

私はSpringCloud Gateway v2.1.2を使用しているので、 Spring CloudRelease Trainsセクションを考慮するとこれは理にかなっていると思います。

1
Greg

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

1
kriver

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>
1
MrKulli