Java 实现Dropwizard资源的自定义日志记录
我有一个具有多个资源的dropwizard应用程序。我需要实现一些自定义日志记录,这些日志记录对于所有资源都应该是相同的,并且应该包含URL、响应时间、响应大小以及从请求头提取的一些数据。一般来说,我希望能够具体说明我想要的内容和格式。我不想在任何资源中添加代码(因为有50多个资源) 我做了一些搜索,找到了一些有趣的文章,但我不知道如何实现它-我尝试过的一些事情没有奏效:Java 实现Dropwizard资源的自定义日志记录,java,jetty,dropwizard,Java,Jetty,Dropwizard,我有一个具有多个资源的dropwizard应用程序。我需要实现一些自定义日志记录,这些日志记录对于所有资源都应该是相同的,并且应该包含URL、响应时间、响应大小以及从请求头提取的一些数据。一般来说,我希望能够具体说明我想要的内容和格式。我不想在任何资源中添加代码(因为有50多个资源) 我做了一些搜索,找到了一些有趣的文章,但我不知道如何实现它-我尝试过的一些事情没有奏效: 我考虑过使用面向方面的编程,因为所有资源都返回Response,但是AspectJ需要Spring,我不想仅仅因为
Response
,但是AspectJ
需要Spring
,我不想仅仅因为这个原因而将其引入到项目中
我还在Dropwizard的metrics中找到了InstrumentedHandler
,它看起来正是我所需要的东西,但我找不到如何将其插入应用程序的任何示例
您对如何实现此日志记录有什么建议吗?这已经为我解决了问题:
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);
}