为 Dropwizard 资源实现自定义日志记录
Implementing custom logging for Dropwizard resources
我有一个包含多个资源的 dropwizard 应用程序。我需要实现一些自定义日志记录,它对所有资源都应该相同,并且应该包含 URL、响应时间、响应大小和从请求 header 中提取的一些数据。一般来说,我希望能够指定我到底想要什么以及以什么格式。我不想向任何资源添加代码(因为它们有 50 多个)。
我进行了一些搜索并发现了一些有趣的文章,但我不知道如何实现它 - 我尝试了一些方法但没有奏效:
- Drop-wizard request response logging
- https://docs.codehaus.org/display/JETTY/Logging+Requests
- http://jersey.576304.n2.nabble.com/Logging-HTTP-Body-of-Request-td7580414.html
我考虑过使用面向方面的编程,因为所有资源 return Response
,但是 AspectJ
需要 Spring
我不想只将其引入项目出于这个原因。
我还在 Dropwizard 的指标中找到 InstrumentedHandler
,this 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);
}
我有一个包含多个资源的 dropwizard 应用程序。我需要实现一些自定义日志记录,它对所有资源都应该相同,并且应该包含 URL、响应时间、响应大小和从请求 header 中提取的一些数据。一般来说,我希望能够指定我到底想要什么以及以什么格式。我不想向任何资源添加代码(因为它们有 50 多个)。
我进行了一些搜索并发现了一些有趣的文章,但我不知道如何实现它 - 我尝试了一些方法但没有奏效:
- Drop-wizard request response logging
- https://docs.codehaus.org/display/JETTY/Logging+Requests
- http://jersey.576304.n2.nabble.com/Logging-HTTP-Body-of-Request-td7580414.html
我考虑过使用面向方面的编程,因为所有资源 return Response
,但是 AspectJ
需要 Spring
我不想只将其引入项目出于这个原因。
我还在 Dropwizard 的指标中找到 InstrumentedHandler
,this 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);
}