Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在spring boot框架下过滤tomcat生成的访问日志_Java_Spring_Tomcat_Spring Boot_Access Log - Fatal编程技术网

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

Java 如何在spring boot框架下过滤tomcat生成的访问日志,java,spring,tomcat,spring-boot,access-log,Java,Spring,Tomcat,Spring Boot,Access Log,我们使用spring boot framework,通过嵌入式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

我们使用spring boot framework,通过嵌入式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"
如何筛选健康检查请求

谢谢你的帮助


根据,我尝试使用conditionIf来解决问题,在我们的spring框架中,我尝试覆盖EmbeddedServletContainerCustomizer类中的定制函数,以便设置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");
            }
      }    
}
据我理解,下一步我们需要做的是设置属性参数,所以我在健康检查控制器的上面写了拦截器,实现如下:

@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;
    }
}
输出:忽略属性为true

但是,在访问日志中仍然可以找到有关运行状况检查的访问通知:

"127.0.0.1 - - [03/Mar/2016:11:34:00 +0800] 'GET /home-svc/isHealth HTTP/1.1' 200 6 120"
我假设属性参数'ignore'是在流程后期设置的,何时以及如何为HttpServletRequest设置属性

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


谢谢您的帮助。

根据对此问题的回答,您应该使用筛选器并将此筛选器添加到筛选器链,而不是通过AOP添加

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


PD:很抱歉反应太晚

你读过Tomcat的,特别是三个
条件
属性了吗?“这应该会给你指明正确的方向。”我按照你的建议做了,遇到了一些困难。我在下一个模块中记录了它,专注于第一个答案。谢谢。我试过上面提到的步骤,效果很好。我认为使用setConditionIf而不是setConditionIf的解决方案有一个错误。即使在使用SetConditionExceptor之后,我也不需要拦截器,我可以在方法调用本身中设置属性。此外,我没有创建新的AccessLogValue,而是获取现有的AccessLogValue并更改它的属性。这有助于确保我也可以从应用程序属性设置值。