読者です 読者をやめる 読者になる 読者になる

Spring BootでJettyのログを少しカスタマイズする

Spring Bootでリクエストログを出力するための方法については、以下の記事で紹介されています。

qiita.com

以下の内容はSpring Boot 1.4.3で確認してます。また、Jetty以外のアプリケーションサーバの場合は当然ながら全く違った設定方法になります。

X-Forwardedヘッダを解釈させる

ELB(AWS)やHerokuなど、前段でSSLが終端されてから(SSL Termination)後続のSpring Bootアプリがリクエストを処理するようなケースでは、本来の送信元IPをアプリが知るためにX-Forwarded-For他、X-Forwarded系のヘッダを解釈させるようにする必要があります。

JettyではForwardedRequestCustomizerというクラスが提供されているので、それを追加してあげればよいです。

    // 途中略

    for (Connector connector : server.getConnectors()) {
        if (connector instanceof ServerConnector) {
            HttpConnectionFactory connectionFactory = connector.getConnectionFactory(HttpConnectionFactory.class);
            connectionFactory.getHttpConfiguration().addCustomizer(new ForwardedRequestCustomizer());
        }
    }
}

出力されるログに独自項目を追加する

元々用意されている NCSARequestLog を継承し、 logExtended メソッドを上書きした拡張ログクラスを作ることで、元の出力内容に加えて独自の項目を出力することができます。
例えばAuthorizationヘッダの内容を最後の項目に出力させたい場合は、以下のような感じです。

public class NCSARequestLogExt extends NCSARequestLog {

    @Override
    protected void logExtended(StringBuilder b, Request request, Response response) throws IOException {
        super.logExtended(b, request, response);

        String authToken = request.getHeader("Authorization");

        if (authToken == null) {
            b.append(" \"-\" ");
        } else {
            b.append(" \"");
            b.append(authToken);
            b.append("\" ");
        }
    }
}