Spring Bootでリクエストログを出力するための方法については、以下の記事で紹介されています。
以下の内容は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("\" "); } } }