SpringCloud 日志过滤

 

在上一节中,我们讨论了在API网关中实现的常见功能。我们已经准备好充当API网关的Zuul服务器。

在本节中,我们将在Zuul API Gateway中实现日志记录功能。

让我们在Zuul API中实现日志记录网关。

步骤1: netflix-zuul-api-gateway-server 项目中,创建一个名称为 的新类文件,ZuulLoggingFilter。

步骤2: 添加注释 @Componenet

步骤3: 扩展 ZuulFilter 类。 ZuulFilter类中有一些抽象方法。这些抽象方法必须在ZuulLoggingFilter类中实现。

步骤4: 将光标移到 ZuulLoggingFilter 上。 它建议两个快速修复方法,如下图所示。单击 添加未实现的方法。 我们获得ZuulFilter类的所有抽象方法的默认实现。

Zuul API Gateway

ZuulFilter 类具有以下列出的四个抽象方法

  • shouldFilter(): shouldFilter()方法检查请求并确定是否要执行过滤器。
  • run(): 如果!isFilterDisabled() shouldFilter()方法都返回,则run()方法将调用是
  • filterType(): filterType()方法按类型对过滤器进行分类。 Zuul中有四种类型的标准过滤器: pre 用于路由前过滤路由用于路由到原点发布(用于路由后过滤器)和错误(用于错误处理)。 Zuul还支持静态响应的静态类型。可以通过调用方法 runFilters(type)来创建或添加和运行任何过滤器类型。
  • filterOrder(): 必须为过滤器定义过滤器顺序。如果优先级对于过滤器不重要,则过滤器可能具有相同的过滤器顺序。过滤器顺序不必是顺序的。

步骤5: 创建 Logger 类对象,并调用 getLogger()方法来创建记录器。

private Logger logger=LoggerFactory.getLogger(this.getClass());

记住: 导入 org.slf4j 包的 Logger 类。

步骤6: run()方法中实现逻辑。

public Object run() throws ZuulException
{
//getting the current HTTP request that is to be handle
HttpServletRequest request=RequestContext.getCurrentContext().getRequest();
//printing the detail of the request
logger.info("request -> {} request uri-> {}", request, request.getRequestURI());
return null;
}

ZuulLoggingFilter.java

package com.codebaoku.microservices.netflixzuulapigatewayserver;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
@Component
public class ZuulLoggingFilter extends ZuulFilter
{
//creating Logger object
private Logger logger=LoggerFactory.getLogger(this.getClass());
@Override
public booleanshouldFilter() 
{
return true; //executing filter for every request
}
//log the content of the request
@Override
public Object run() throws ZuulException
{
//getting the current HTTP request that is to be handle
HttpServletRequest request=RequestContext.getCurrentContext().getRequest();
//prints the detail of the requestin the log
logger.info("request -> {} request uri-> {}", request, request.getRequestURI());
return null;
}
@Override
public String filterType() 
{
return "pre"; //intercept all the request before execution
}
@Override
public intfilterOrder() 
{
return 1; //setting filter order to 1
}
}

在下一步中,我们将看到如何使用Zuul拦截请求。

 步骤1: 运行 netflix-eureka-naming-server。步骤2: 在端口 8000 上运行 currency-exchange-service 。步骤3: 在端口 81 ...