我们正在使用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秒就一直运行健康检查,我们要过滤的请求以便我们可以获得清晰的访问日志,健康检查网址就像样本:
"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,我尝试使用 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的属性(“ignore”)是否被评估。
@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;
}
}
输出:ignore属性为true
但是,仍然可以在访问日志中找到健康检查的访问通知:
"127.0.0.1 - - [03/Mar/2016:11:34:00 +0800] 'GET /home-svc/isHealth HTTP/1.1' 200 6 120"
我假设属性参数'ignore'在进程的后期设置,何时以及如何为HttpServletRequest设置setAttribute?
如果我们的假设不正确,是什么让这些操作不起作用?
感谢您的帮助。
答案 0 :(得分:0)
根据对问题https://stackoverflow.com/a/55569199/3346298的回答Exclude certain requests from Tomcat's log的建议,您应该使用一个过滤器,并将此过滤器添加到filterChain中,而不是通过AOP添加它。
出于同样的原因,似乎在执行AOP方面之前已检查了日志/非日志功能。
PD:对不起,您的回复很晚