filebeat에서, log 파일을 긁어갈 때 multiline을 설정하는 것이 있습니다. 이번 시간에는 이 중에서 간단하게 pattern만 잘 설정해 보도록 하겠습니다.

 


 Filebeat에서 logstash로 보내지 않고, 바로 ElasticSearch로 보냅니다. 로그가 어떻게 elasticsearch에 적재되는지, kibana로 보도록 하겠습니다.

 

 log.file.path로 불러 오는군요. 저기서, /home/cho/jo_test/logs는 사실, log가 발생하는 프로그램이, 로그를 저장하는 위치입니다.

 

 

 해당 프로그램의 logback-spring.xml 파일의 일부입니다. LOG_DIR이 logs 밑으로 잡혀있고, 저는 이 디렉토리 밑에 로그들을 모두 떨굴 겁니다.

 

 

 제 서버에서는 이 위치에 떨굴 겁니다. 그러니, /home/cho/jo_test/logs 밑에 있는 파일들이 변경 되었는지만 보면 됩니다. 이는 접두사 조건과 관련이 있습니다.

 

 다음에, 이 프로그램은 foo라는 주소로 json 형식으로 item x와, x의 정수값을 넘겨주면, log를 출력합니다. 음수를 넘겨주면 예외를 던지게 했고, 양수를 던지면 넘겨준 x의 값과 I'm happy를 개행을 구분자로 해서 로그에 남깁니다.

 

 

 로그 파일에는 이런 식으로 떨궈 집니다.

 

 

 이제, json을 아래와 같이 작성해서 넘겨 보겠습니다. 뭔가 어려워 보이지만, 2번째 줄은 select, 3번째 줄은 log.file.path의 prefix가 "/home/cho/jo_test/logs"를 만족해야 하는 필터링을, 8번째 줄은 timestamp가 내림차순이라는 것을 의미합니다. 즉, 최신순으로 정렬해서 나타내겠다는 의미입니다.

 

 

 

 그러면, I'm happy라는 것과 [Info ] 라는 것과 따로 나오게 되는데요. 이는 제가 multiple line 옵션을 따로 설정하지 않았기 때문입니다.

 


 filebeat.yml에 multiline.pattern 옵션을 위와 같이 설정해 보겠습니다. 로그는 yyyy-mm-dd hh:mm:ss [ 이런 식으로 시작합니다. yyyy나 mm이나 dd나, hh, mm, ss 등은 숫자로 이루어져야 합니다. 이는 문자집합 [0-9]로 표현할 수 있습니다. 다음에 이 패턴이 차례대로 4번, 2번, 2번, 2번, 2번, 2번이 나와야 합니다. 숫자가 4번 나오는 패턴은 [0-9]{4}로 표현할 수 있습니다.

 

 그리고 [ 문자인 경우, escaping 처리를 해야 하니, \[로 작성하였습니다. 패턴의 시작은 ^이니, 위의 패턴을 해석해 보면 아래와 같습니다.

 

 저는 인식할 패턴 하나를 설정하였습니다. 그러면, [로 시작하는 패턴은 어떻게 작성하면 될까요? ^\[입니다. multiline.pattern은 정규 표현식을 지원합니다. 이에 대한 상세한 내용은 문서를 참고하시면 좋겠습니다. 문제는, 우리는 이 패턴이 시작될 때 구분자로 삼아야 한다는 겁니다. 이것은 negate와 match 옵션에서 설정을 할 수 있는데요.

 

 이 문서에 따르면, 이 둘의 값을 각각 true, after로 설정해야 합니다. 왜냐하면, 패턴과 매치되지 않은 line을 뒤에 append 시켜야 하기 때문입니다. 

 

 

 이렇게 설정하고, filebeat를 재시작 해 보겠습니다.

 


 다시, 컨트롤러 foo에 x값이 5인 Request를 넘겨 보겠습니다.

 

 실행 결과만 보면 되겠군요. 아까와 똑같이, timestamp 내림차순, prefix가 /home/cho/jo_test/logs, message 필드만 뽑게끔 쿼리를 작성해 보겠습니다.

 

 

 그러면, 아까와는 다르게, \n이 있어도, 계속 받는다는 것을 알 수 있습니다. 이는 제가 multiline을 설정했기 때문입니다. 그리고, 이것은 yyyy-mm-dd hh:mm:ss [가 나오면 새로 시작됩니다.