[SPRING] 봄 부트 프레임 워크에서 Tomcat이 생성 한 액세스 로그를 필터링하는 방법
SPRING봄 부트 프레임 워크에서 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"
상태 확인 요청을 필터링하는 방법
도와 주셔서 감사합니다.
액세스 로깅에 관한 문서에 따르면 problemIf를 사용하여 문제를 해결하려고 시도했지만 Spring Framework에서 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의 attribute ( "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;
}
}
그러나 액세스 로그에 상태 확인 정보가 계속 표시됩니다.
"127.0.0.1 - - [03/Mar/2016:11:34:00 +0800] 'GET /home-svc/isHealth HTTP/1.1' 200 6 120"
나는 속성 매개 변수 'ignore'가 프로세스의 후반부에 HttpServletRequest에 대한 setAttribute를 설정하는 방법과 설정 방법을 가정 했습니까?
우리의 가정이 정확하지 않다면, 무엇이 작동하지 않는가?
도와 주셔서 감사합니다.
해결법
from https://stackoverflow.com/questions/35714626/how-to-filter-access-logs-generated-by-tomcat-under-spring-boot-framework by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 데이터 JPA 분리 엔터티 (0) | 2019.04.26 |
---|---|
[SPRING] @WebMvcTest가 java.lang.IllegalStateException로 실패합니다 : ApplicationContext를로드하지 못했습니다. (0) | 2019.04.26 |
[SPRING] web.xml의 CharacterEncodingFilter를 사용한 Spring 인코딩 (0) | 2019.04.26 |
[SPRING] Embedded Redis가 실제 Redis 서버에 연결하려고 시도하여 예외가 발생합니다. (0) | 2019.04.26 |
[SPRING] Spring @Transactional을 사용한 TestNG 다중 스레드 테스트 (0) | 2019.04.26 |