我正在使用 Grizzly 为 Jersey 应用程序提供服务,同时使用 Logback 来满足我的日志记录需求。请注意这里不Servlet
涉及 s,我使用如下代码“手动”启动所有内容:
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功能使客户端的套接字地址在日志记录中可见。为此,我需要一些地方将侦听器连接到 HTTP 处理,该处理会收到有关传入请求(我可以将地址放入 MDC)和请求完成时的通知(以便我可以清理 MDC)。我采用的一种方法是将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;
}
}
不幸的是,泽西岛ContainerRequest
没有提供有关已连接客户端的信息(这确实令人惊讶)。
我怀疑灰熊本身应该存在类似的界面,但我无法将其挖掘出来。