Jersey JAX-RS:将日志记录扩展到资源类调度

Jersey JAX-RS:将日志记录扩展到资源类调度,jersey,jax-rs,Jersey,Jax Rs,我正在使用Jersey JAX-RS进行REST服务。 我在SE部署中使用GrizzlyHttp在我的程序中运行它 我还注册了一个记录器,它打印出HTTP请求和响应 我缺少的是在HTTP服务器和资源类之间进行日志记录 如果没有路径匹配,或者路径匹配但参数不匹配,或者类似情况,我希望查看日志条目。今天,我需要检查注释并将其与记录的HTTP参数进行比较。在周围多记录一些日志会有帮助的 这可能吗?您可以通过使用预匹配过滤器来实现 预匹配过滤器是在JAR-RS运行时尝试将请求与资源匹配之前调用的过滤器。

我正在使用Jersey JAX-RS进行REST服务。 我在SE部署中使用GrizzlyHttp在我的程序中运行它

我还注册了一个记录器,它打印出HTTP请求和响应

我缺少的是在HTTP服务器和资源类之间进行日志记录

如果没有路径匹配,或者路径匹配但参数不匹配,或者类似情况,我希望查看日志条目。今天,我需要检查注释并将其与记录的HTTP参数进行比较。在周围多记录一些日志会有帮助的


这可能吗?

您可以通过使用预匹配过滤器来实现

预匹配过滤器是在JAR-RS运行时尝试将请求与资源匹配之前调用的过滤器。这种类型的筛选器允许您记录请求的URI,即使它可能与您的任何资源都不匹配。您可以使用
@PreMatching
注释对过滤器进行注释,这就是在资源匹配阶段之前调用过滤器所需做的全部工作

注意::如果希望在提供者扫描阶段JAX-RS运行时可以发现过滤器,则需要使用
@provider
注释对其进行注释。或者,您可以在应用程序设置中手动注册它(正如我所做的,这就是为什么在下面的示例中,我没有用
@Provider
注释过滤器)

下面是一个非常简单的预匹配过滤器示例

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;

@PreMatching
public class PreMatchingFilterExample implements ContainerRequestFilter {

    private final static Logger LOG = LogManager.getLogger(PreMatchingFilterExample.class);
    @Context
    UriInfo uriInfo;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        LOG.info("Resource not found: " + uriInfo.getAbsolutePath());
        LOG.info("Path params: " + uriInfo.getPathParameters());
        LOG.info("Query params: " + uriInfo.getQueryParameters());
    }
}