我正在尝试为在泽西岛之上构建的项目制定日志记录标准,我想提供一种简单的方法来记录请求信息和响应,以防发生异常。下面的代码说明了我的想法:
Client client = null;
Response response = null;
try {
client = ClientBuilder.newClient();
response = client.target("<URL>")
.request(MediaType.APPLICATION_JSON)
.post(entity);
} catch( Exception ex) {
//Send information for exception mapping to a JSON log
throw new ServiceException( client,response );
}
问题是如何在ServiceException
类中获得以下内容:
String url = client.getUri().toString(); //only one I could get using WebTarget
MultivaluedMap<String, String> headers = client.getHeaders();
String body = client.getEntity();
MultivaluedMap<String, String> queryParams = client.getQueryParams();
String method = client.getMethod();
我尝试访问WebTarget
但没有运气。
提前感谢!
Jersey 对客户端和服务器端都有日志记录支持。该文档显示了如何向Client
注册它。它也可以在WebtTarget
注册。
如果您对结果不满意,并且想要实现自己的结果,我会以与 Jersey 相同的方式实现它:结合使用WriterInterceptor
来记录请求实体流1,并使用Client(Request|Response)Filter
2来获取请求和响应的其他部分(如标头和请求行(。
您可以查看ClientLoggingFilter
和LoggingInterceptor
的来源,以获得有关实现的一些想法。
1- 它需要使用拦截器,而不仅仅是对所有内容使用过滤器,因为过滤器只会给你预 seriazlied 对象,它可以是任何很难记录的东西。使用输入流执行通用日志记录更容易。
2- 请参阅过滤器和拦截器