为 Dropwizard 资源实现自定义日志记录

Implementing custom logging for Dropwizard resources

我有一个包含多个资源的 dropwizard 应用程序。我需要实现一些自定义日志记录,它对所有资源都应该相同,并且应该包含 URL、响应时间、响应大小和从请求 header 中提取的一些数据。一般来说,我希望能够指定我到底想要什么以及以什么格式。我不想向任何资源添加代码(因为它们有 50 多个)。

我进行了一些搜索并发现了一些有趣的文章,但我不知道如何实现它 - 我尝试了一些方法但没有奏效:

我考虑过使用面向方面的编程,因为所有资源 return Response,但是 AspectJ 需要 Spring 我不想只将其引入项目出于这个原因。

我还在 Dropwizard 的指标中找到 InstrumentedHandlerthis article 它看起来正是我需要的东西,但我找不到任何示例如何将它插入应用程序。

您对如何实现此日志记录有任何建议吗?

这对我有用:

import com.sun.jersey.api.container.filter.LoggingFilter;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerRequestFilter;
import com.sun.jersey.spi.container.ContainerResponse;

public class LogFilter extends LoggingFilter implements ContainerRequestFilter {

    private final ThreadLocal<Long> startTime = new ThreadLocal<>();

    @Override
    public ContainerRequest filter(ContainerRequest containerRequest) {
        // gets called when the request comes in
        startTime.set(System.currentTimeMillis());
        return containerRequest;
    }

    @Override
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
        // gets called when the response is about to be returned
        // do the logging here
        return response;
    }

}

并且在应用程序的 运行 方法中:

@Override
public void run(MyConfiguration configuration, Environment environment) {
    LogFilter logFilter = new LogFilter();
    environment.jersey().getResourceConfig().getContainerRequestFilters().add(logFilter);
    environment.jersey().getResourceConfig().getContainerResponseFilters().add(logFilter);
}