ロギングのニーズに Logback を使用しながら、Grizzly を使用して Jersey アプリケーションを提供しています。ここには s が含まれていないことに注意してくださいServlet
。次のようなコードを使用して、すべてを「手動で」起動します。
final URI uri = /* this is a configuration option */
this.server = new HttpServer();
final NetworkListener nl = new NetworkListener(
"grizzly", uri.getHost(), uri.getPort());
server.addListener(nl);
final GuiceComponentProviderFactory gcpf =
new GuiceComponentProviderFactory(rc, inj);
final HttpHandler processor = ContainerFactory.createContainer(
HttpHandler.class, rc, gcpf);
this.server.getServerConfiguration().addHttpHandler(
processor, uri.getPath());
server.start();
ここで、Logback のMDC機能を使用して、クライアントのソケット アドレスをログ レコードに表示したいと考えています。この目的のために、着信リクエスト (MDC にアドレスを入れることができる場所) とリクエストが完了したとき (MDC をクリーンアップできるようにするため) について通知を受ける HTTP 処理にリスナーを接続する場所が必要です。私が従ったアプローチの 1 つは、次のContainer*Filter
ように、Jersey でインスタンスを接続することです。
class MdcFilter implements
ContainerRequestFilter, ContainerResponseFilter {
@Override
public ContainerRequest filter(ContainerRequest request) {
MDC.put("http-client", "foo" /* no way to get the address here */);
return request;
}
@Override
public ContainerResponse filter(
ContainerRequest request,
ContainerResponse response) {
MDC.remove("http-client");
return response;
}
}
残念ながら、JerseyContainerRequest
は接続されたクライアントに関する情報を提供しません (これには本当に驚きました)。
Grizzly 自体にも同様のインターフェイスが存在するはずですが、掘り出すことができませんでした。