gpt4 book ai didi

java - 我如何才能获得使用 Grizzly/Jersey 进行日志记录的客户端地址?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:59 25 4
gpt4 key购买 nike

我使用 Grizzly 为 Jersey 应用程序提供服务,同时使用 Logback 满足我的日志记录需求。请注意,这里没有涉及 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使客户端的套接字地址在日志记录中可见的功能。为此,我需要一些地方来将监听器连接到 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;
}

}

不幸的是,Jersey ContainerRequest 不提供有关已连接客户端的信息(这真是令人惊讶)。

我怀疑 Grizzly 本身应该存在类似的界面,但我无法挖掘出来。

最佳答案

对于 Grizzly,相关的 API 称为 HttpServerProbe .使用这个,它归结为这样的事情:

final HttpServer server = new org.glassfish.grizzly.http.server.HttpServer();
server.addListener(new NetworkListener("grizzly", "localhost", 8080));
server.getServerConfiguration().addHttpHandler(
new StaticHttpHandler("/var/www/"), "/");

server.getServerConfiguration().getMonitoringConfig().getWebServerConfig()
.addProbes(new HttpServerProbe.Adapter() {

@Override
public void onRequestReceiveEvent(
HttpServerFilter filter,
Connection connection,
Request request) {

System.out.println(request.getRemoteAddr());
MDC.put("http-client", request.getRemoteAddr());
}

@Override
public void onRequestCompleteEvent(
HttpServerFilter filter,
Connection connection,
Response response) {

MDC.remove("http-client");
}
}

server.start();

请注意,还有更多可能相关的事件,例如暂停、恢复和取消。这些可能也应该被处理,特别是如果使用长轮询(又名 Comet,又名 whatnot)。但基本上这是 Hook 的地方。

关于java - 我如何才能获得使用 Grizzly/Jersey 进行日志记录的客户端地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17233960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com