使用过滤器的 Jersey 自定义日志记录请求和响应实体

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(291)   2023-06-26 07:54:18

默认情况下,Jersey 使用 JUL 进行日志记录——并且不会在日志中打印请求/响应实体主体。要打印实体内容,您必须创建自己的 LoggingFiler,并将其注册以代替默认的 org.glassfish.jersey.filter.LoggingFilter。在这个例子中,我正在创建一个这样的基本 CustomLoggingFilter,它扩展了 org.glassfish.jersey.filter.LoggingFilter 并实现了 ContainerRequestFilter$$ $ 接口,以便它可以拦截正在进行的请求和响应。

创建 CustomLoggingFilter

让我们直接进入这个球衣演示的自定义日志记录过滤器类。

package com.cundage.jersey.provider;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;

import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.message.internal.ReaderWriter;

public class CustomLoggingFilter extends LoggingFilter implements ContainerRequestFilter, ContainerResponseFilter 
{
	@Override
	public void filter(ContainerRequestContext requestContext)	throws IOException 
	{
		StringBuilder sb = new StringBuilder();
		sb.append("User: ").append(requestContext.getSecurityContext().getUserPrincipal() == null ? "unknown"
						: requestContext.getSecurityContext().getUserPrincipal());
		sb.append(" - Path: ").append(requestContext.getUriInfo().getPath());
		sb.append(" - Header: ").append(requestContext.getHeaders());
		sb.append(" - Entity: ").append(getEntityBody(requestContext));
		System.out.println("HTTP REQUEST : " + sb.toString());
	}

	private String getEntityBody(ContainerRequestContext requestContext) 
	{
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		InputStream in = requestContext.getEntityStream();
		
		final StringBuilder b = new StringBuilder();
		try 
		{
			ReaderWriter.writeTo(in, out);

			byte[] requestEntity = out.toByteArray();
			if (requestEntity.length == 0)
			{
				b.append("").append("\n");
			}
			else
			{
				b.append(new String(requestEntity)).append("\n");
			}
			requestContext.setEntityStream( new ByteArrayInputStream(requestEntity) );

		} catch (IOException ex) {
			//Handle logging error
		}
		return b.toString();
	}

	@Override
	public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException 
	{
		StringBuilder sb = new StringBuilder();
		sb.append("Header: ").append(responseContext.getHeaders());
		sb.append(" - Entity: ").append(responseContext.getEntity());
		System.out.println("HTTP RESPONSE : " + sb.toString());
	}
}

注册 CustomLoggingFilter

要注册此CustomLoggingFilter,请按此方式注册。

package com.cundage.jersey;

import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;

import com.cundage.jersey.provider.CustomLoggingFilter;

public class CustomApplication extends ResourceConfig 
{
	public CustomApplication() 
	{
		packages("com.cundage.jersey");
		register(JacksonFeature.class);

		register(CustomLoggingFilter.class);
	}
}

使用默认 LoggingFilter 记录语句

现在,如果您尝试在没有 CustomLoggingFilter 的情况下使用任何现有的 REST API,日志将以这种方式显示。

请求

Jersey-custom-logging

日志

Sep 30, 2015 6:18:41 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 1 * Server has received a request on thread http-bio-8080-exec-4
1 > POST http://localhost:8080/JerseyDemos/rest/employees
1 > accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
1 > accept-encoding: gzip, deflate
1 > accept-language: null
1 > cache-control: no-cache
1 > connection: keep-alive
1 > content-length: 35
1 > content-type: application/json; charset=UTF-8
1 > host: localhost:8080
1 > pragma: no-cache
1 > user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0

Sep 30, 2015 6:18:41 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 1 * Server responded with a response on thread http-bio-8080-exec-4
1 < 200
1 < Content-Type: application/json

使用 CustomLoggingFilter 记录语句

添加 CustomLoggingFilter 后,您将获得更好的日志,如下所示。

HTTP REQUEST : User: unknown - Path: employees - Header: {host=[localhost:8080], user-agent=[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0], accept=, accept-language=[null], accept-encoding=[gzip, deflate], content-type=[application/json; charset=UTF-8], content-length=[35], connection=[keep-alive], pragma=[no-cache], cache-control=[no-cache]} - Entity: {"id":2,"name":"Alex Kolenchiskey"}

HTTP RESPONSE : Header: {Content-Type=[application/json]} - Entity: Employee [id=2, name=Alex Kolenchiskey]
请随时根据您的需要从日志语句中添加/删除信息。您可以在这些日志中添加许多其他有用的信息。

快乐学习!!

标签2: Jersey Java Logging
地址:https://www.cundage.com/article/jersey-custom-logging-request-and-response-entities-using-filter.html

相关阅读

默认情况下,Jersey 使用 JUL 进行日志记录——并且不会在日志中打印请求/响应实体主体。要打印实体内容,您必须创建自己的 LoggingFiler,并将其注册以代替默认的 org.gla...
在 Jersey ExceptionMapper 示例中,我们将学习使用 ExceptionMapper 接口,同时开发 Jersey RESTful Web 服务。出于演示目的,我正在修改为球...
在本例中,我们将学习将 cookie 设置到 Jersey 客户端调用的 HTTP 请求中。此示例使用 Invocation.Builder 将 cookie 设置为传出 REST 调用。 设置...
学习使用 Spring Boot 和 Jersey 框架配置和创建 JAX-RS 2.0 REST API。此示例应用程序使用 Jersey 的 ServletContainer 来部署 RES...
如果您已经开始使用 Jersey,那么在配置它时可能会遇到这个问题。这是项目对运行时依赖不足的结果。 tomcat服务器很可能会遇到这个问题。 随机异常 错误 错误日志将如下所示。 SEVERE...
在此Jersey rest 安全示例中,我们将学习使用基本身份验证保护Jersey REST API。这将强制每个用户提供用户名/密码以对门户进行身份验证。此外,用户还必须具有一定级别的角色。我...
本教程解释了如何将 google Gson 与 Jersey 2.x 结合使用。还有一些其他的 java 库也能够进行这种转换,例如MOXy、杰克逊或JSONP;但是 Gson 是极少数不需要任...
在此示例中,我们将学习将 cookie 设置为 Jersey REST API 发送的 HTTP 响应。此示例使用 javax.ws.rs.core.Response 将 cookie 设置为发...
默认情况下,在 JAX-RS 中,@Path 注释中指定的所有 URL 都是CASE-SENSITIVE。在本教程中,我给出了一个简单的 CASE-INSENSITIVE URL 示例,可以在任...
Spring Boot Jersey 教程展示了如何在 Spring Boot 应用程序中使用 Jersey 设置一个简单的 RESTFul 应用程序。 Jersey 是使用 @RestCont...