java - spring boot框架下如何过滤tomcat生成的访问日志

标签 java spring tomcat spring-boot access-log

我们使用的是spring boot框架,通过内嵌的tomcat生成访问日志,访问日志的格式如下属性:

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

幸运的是,访问日志生成成功,我们得到了肯定的结果:
"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 如下示例:
"127.0.0.1 - - [01/Mar/2016:12:04:10 +0800] 'GET /school-svc/isHealth HTTP/1.1' 200 6 104"

如何过滤健康检查请求?

感谢帮助。

根据 documentation on access loging ,我尝试使用 条件如果 为了解决这个问题,在我们的spring框架中,我尝试覆盖EmbeddedServletContainerCustomizer类中的customize函数,以便conditionIf可以设置,我们的实现如下示例:
 @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");
            }
      }    
}

在我的理解中,下一步我们需要做的是设置属性参数,所以我在健康检查 Controller 上面写了拦截器,实现如下:
@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 的属性(“忽略”)。
@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;
    }
}

output: ignore attribute is true



但是,在访问日志中仍然可以找到健康检查的访问通知:
"127.0.0.1 - - [03/Mar/2016:11:34:00 +0800] 'GET /home-svc/isHealth HTTP/1.1' 200 6 120"

我假设属性参数“忽略”在过程后期设置,何时以及如何为 HttpServletRequest 设置属性?

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

感谢帮助。

最佳答案

正如回复 https://stackoverflow.com/a/55569199/3346298 所建议的那样关于这个问题 Exclude certain requests from Tomcat's log ,您应该使用过滤器并将此过滤器添加到过滤器链中,而不是通过 AOP 添加它。
出于同样的原因,似乎在执行 AOP 方面之前检查了日志/非日志功能。
PD:抱歉回复晚了

关于java - spring boot框架下如何过滤tomcat生成的访问日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35714626/

相关文章:

spring - 如何在 Spring Boot Jackson 日期序列化中应用默认时区

java - 在 Springboot mongodb 中创建自定义查询(使用 crudRepository)

java - 在插件中使用 JDialog 时如何防止卡住?

java - Java 8中列表的二级过滤

java - SoapException : Server did not recognize the value of HTTP Header SOAPAction

Spring Java Config - 使用接口(interface)公开 bean

java - JOOQ - 列 "id"是 uuid 类型,但表达式是字符类型变化

JAVA VM 内存选项 32bit 小于 2g 不工作

tomcat - 如何在 Tomcat 中托管静态文件以及该文件的 URL 是什么?

java - AWS ELB servlet 客户端断开检测