log를 쌓기만 하면 의미가 없을 겁니다. 이것을 적절히 가공해서 어딘가로 보내는 것이 logstash라고 할 수 있는데요. 이 글에서는, 특정 조건에 따라 처리하는 방법을 다르게 하는 conditional에 대해서 간단하게 언급해 보겠습니다. if절이나, if else 절이 꽤 많이 나올 거 같네요. logstash와 filebeat는 8.1.2 버전을 썼음을 미리 알려드립니다.

 


 먼저, filebeat의 설정 파일을 보겠습니다. filebeat.inputs는 어디로부터 입력을 받을지에 대해서 설정하는 것인데요. 뭔가 복잡해 보입니다. /var/log에 있는 log 파일들로부터 input을 얻어옵니다. 또 /home/cho 밑에 있는 log 파일로부터 또 뭔가를 얻어오는데요. 저는 /home/cho 밑에 있는 로그들로부터 발생한 것들은 fields를 붙일 겁니다. 필드 이름은 project이고, project의 값은 django로 하겠습니다.

 

 

 filebeat로 처리한 것을 바로 es로 쏘는 것이 아니라 logstash로 쏘도록 하겠습니다. 그러면 이 logstash가 적절히 가공을 해서 다른 곳으로 보낼 겁니다.

 


 이제 logstash-sample.conf를 보겠습니다. 먼저 input을 정의하는데요. sample에는 input으로 beats만 받습니다.

 

 

 다음에 어떠한 가공 처리도 없이, 바로 stdout, 표준 출력으로 output을 보내 버립니다. 아래 그림은 이 파이프라인만 돌렸을 때, 터미널에 출력된 것 중 일부입니다.

 

 


 이제 우리는 /home/cho로부터 발생한 이벤트에 대해서만 출력을 하려고 합니다. 어떻게 하면 좋을까요? /home/cho에서 발생한 이벤트에 대해서는 제가 django라는 이름을 가진 project라는 필드를 붙였습니다. logstash로 들어온 입력을 보면, 아래와 같습니다.

 

 

 "field"의 "project"가 "django"네요. 고로 [fields][project]로 접근이 가능합니다.

 

 

 우리는 output 부분에서, [fields][project]가 "django"라면, 터미널에 출력할 겁니다. 어떻게 하면 될까요? 단지, 우리는 조건문 if [fields][project] == "django"을 걸어주면 됩니다.11번째 줄이 이를 수행합니다.

 

 

 이제, /home/cho 폴더에 있는 test.log에 echo 명령어와 redirect를 이용해서 파일에 내용을 append 시킵니다. 분명 시스템 상의 로그도 많을 텐데 희안하게도 /home/cho에 있는 log 파일들에 발생한 이벤트에 대해서만 터미널에 출력됨을 알 수 있어요.

 

 

 정말 그렇게 나오는지는, 크흠. 만약에 fields의 project의 value가 "dj"라는 부분문자열을 가지는 경우에 출력해야 한다면 어떻게 하면 좋을까요? 문서를 보면, =~나 !~는 regex와 관련이 있음을 알 수 있어요. 이 중 =~는 패턴이 일치하는 부분이 있을 때 참값을 리턴해 버립니다.

 

 

 그러면 if [fields][project] =~ "dj"는 무엇을 의미할까요? fields의 project의 value 값이 "dj"라는 패턴에 매칭이 되는 부분이 있는지를 의미합니다. "django" 문자열은 "dj"와 match 되는 부분이 있으므로, 참이 리턴됩니다. 따라서, /home/cho 밑에 있는 test.log에 무언가가 append가 된 경우 터미널에 출력이 됩니다.