首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在spring引导框架下过滤tomcat生成的访问日志

如何在spring引导框架下过滤tomcat生成的访问日志
EN

Stack Overflow用户
提问于 2016-03-01 04:23:27
回答 1查看 4.5K关注 0票数 5

我们使用spring引导框架,通过嵌入式tomcat生成访问日志,访问日志的格式如下所示:

代码语言:javascript
复制
server.tomcat.access-log-enabled=true
server.tomcat.access-log-pattern="%h %l %u %t '%r' %s %b %D"
server.tomcat.basedir=/data/logs/Waijule/SchoolService/access

幸运的是,生成的访问日志成功了,我们得到了一个积极的结果:

代码语言:javascript
复制
"127.0.0.1 - - [01/Mar/2016:11:25:47 +0800] 'POST /school-svc/index-summary HTTP/1.1' 200 127 21"
"127.0.0.1 - - [01/Mar/2016:11:25:47 +0800] 'POST /school-svc/wechat/signature/get HTTP/1.1' 200 238 9"
"127.0.0.1 - - [01/Mar/2016:11:25:47 +0800] 'POST /school-svc/wechat/ticket/get HTTP/1.1' 200 225 148"

为了确保服务健康,我们每5秒运行一次健康检查,我们希望过滤的请求可以得到清晰的访问日志,健康检查url就像下面的示例:

代码语言:javascript
复制
"127.0.0.1 - - [01/Mar/2016:12:04:10 +0800] 'GET /school-svc/isHealth HTTP/1.1' 200 6 104"

如何过滤健康检查请求?

谢谢你帮忙。

根据关于访问标记的文档,我尝试使用 conditionIf 来解决问题,在我们的春季框架中,我试图覆盖EmbeddedServletContainerCustomizer类中的自定义函数,以便conditionIf可以设置,我们的实现类似于下面的示例:

代码语言:javascript
复制
 @Configuration
 public class Application implements EmbeddedServletContainerCustomizer {
     @Override
     public void customize(ConfigurableEmbeddedServletContainer container)
     {
         if (container instanceof TomcatEmbeddedServletContainerFactory)
            {
                log.debug("It is TomcatEmbeddedServletContainerFactory");
                TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container;
                AccessLogValve accessLogValve = new AccessLogValve();                    
                accessLogValve.setConditionIf("ignore");
                factory.addContextValves(accessLogValve);
            }
            else
            {
                log.error("WARNING! this customizer does not support your configured container");
            }
      }    
}

在我的理解中,我们需要做的下一步是设置属性参数,因此我在健康检查控制器的上面编写了拦截器,实现如下:

代码语言:javascript
复制
@Component
@Aspect
public class HealthCheckInterceptor
{
    @Before("execution(* com.waijule.home.controller.HealthCheckController.process(..))")
    private void beforeGetHomeDetailByHomeIdWithTry(JoinPoint joinPoint)
    {
        try
        {
            Object[] args = joinPoint.getArgs();
            Prediction.checkTrue(args[0] instanceof HttpServletRequest);
            HttpServletRequest request = (HttpServletRequest) args[0];
            request.setAttribute("ignore", "true");
        }
        catch (Exception e)
        {
            log.error(e.getMessage());
        }
    }
}

最后,检查RequestServlet值的属性(“忽略”)。

代码语言:javascript
复制
@RestController
@RequestMapping(value = { "/home-svc/isHealth" }, method = { RequestMethod.GET, RequestMethod.HEAD })
public class HealthCheckController
{
    private String HEALTH = "health";

    @RequestMapping
    public String process(HttpServletRequest request)
    {
        log.debug("ignore attribute is {}", request.getAttribute("ignore"));
        return HEALTH;
    }
}

输出:忽略属性为真

然而,access通知健康检查仍然可以在访问日志中找到:

代码语言:javascript
复制
"127.0.0.1 - - [03/Mar/2016:11:34:00 +0800] 'GET /home-svc/isHealth HTTP/1.1' 200 6 120"

我认为属性参数‘忽略’是在进程后期设置的,何时以及如何为setAttribute进行HttpServletRequest?

如果我们的假设不正确,是什么使操作不起作用?

谢谢你帮忙。

EN

回答 1

Stack Overflow用户

发布于 2020-06-23 16:32:32

正如响应https://stackoverflow.com/a/55569199/3346298对这个问题排除Tomcat日志中的某些请求提出的建议,您应该使用一个过滤器,并将这个过滤器添加到filterChain中,而不是由AOP添加它。

出于同样的原因,在执行AOP方面之前,似乎会检查日志/not日志特性。

PD:抱歉,反应太晚了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35714626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档