サーブレットコンテナとしても使える 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 に一元化したいため今回はこうした。