Edited at

埋め込み Undertow でアクセスログを残す

More than 3 years have passed since last update.

サーブレットコンテナとしても使える Undertow ですが、Jetty と同様、Jar に一緒に入れて使うこともできます。しかしその際の access log (よくみる CLF 的なアレ)のとり方があまりドキュメントとしてインターネットにない感じだったので書く。

基本的にはメインになる HttpHandler をラップし、ログだけ残す仕事をしてくれる AccessLogHandler を使えば良い:


Main.java

public static void main(String[] args) throws Exception {

Logger accesslogger = LoggerFactory.getLogger("accesslog");
HttpHandler mainHanlder = exchange -> {
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send("Foo");
};
HttpHandler handler = new AccessLogHandler(
pathHandler,
accesslogger::info,
"combined",
Main.class.getClassLoader());
Undertow.builder()
.addHttpListener(8080, "0.0.0.0")
.setHandler(handler)
.build().start();
}

第2引数の AccessLogReciever にはいくつかバンドルされている実装があるが、ログの制御は logback に一元化したいため今回はこうした。