Я использую Grizzly для обслуживания приложения на Джерси и использую 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
к Джерси, который выглядел так:
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
не предоставляет информацию о подключенном клиенте (что стало настоящим сюрпризом).
Подозреваю, что аналогичный интерфейс должен существовать и у самого Grizzly, но мне не удалось его раскопать.