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类的所有抽象方法的默认实现。
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 ...