안녕하세요. 이번 시간에는 logstash에서 다중 파이프라인을 이용하는 방법을 알아봅시다.

 


 먼저 logstash-sample.conf 파일을 보겠습니다.

 

 input은 2개가 있습니다. 먼저, "/home/chokw/1.log" 에서 들어오는 것과, "/home/chokw/2.log"에서 들어오는 것이 있습니다. 파일의 변화를 감지해서, 변화가 되면 logstash로 들어오게 됩니다. 1.log로부터 들어오는 type은 "log_1"로, 2.log로부터 들어오는 type은 "log_2"로 정의하였습니다.

 

 

 이제, 우리는 이 type에 따라서 codec을 rubydebug로 할 건지, line으로 할 것인지를 결정합니다. codec을 rubydebug로 하는 경우, type이 "log_1"이고, line으로 하는 경우 type이 "log_2" 가 됩니다.

 

 

 이제 /home/cho 위치로 와서, 1.log에 "12345"를, 2.log에 "67890"을 입력해 보겠습니다.

 

 

 그러면, 1.log가 변화된 정보는, type이 "log_1"이기 때문에 rubydebug 표현 형식으로 출력돕니다.

 

 다음에, 2.log가 변화된 정보는, type이 "log_2"이기 때문에 line으로 표시가 됩니다. 사실, if else if로 표시해도 별 문제는 없습니다. 그런데, 이 상황을 잘 보면, 아래와 같습니다.

 

 source에 따라 처리되는 방식이 다릅니다. 이 경우는 꽤 흔합니다. 예를 들자면 로그 파일의 형식이 다르다던지. 이러한 경우, if else로 처리할 수도 있지만, 보다 깔끔하게 처리하는 방법은 파이프라인을 분리하는 것입니다.

 


 먼저 logstash-1.conf입니다. /home/chokw/1.log가 변화하면 input으로 정보를 받아서, rubydebug 형식으로 출력합니다. 파이프라인 1번입니다.

 

 다음에, logstash-2.conf입니다. /home/chokw/2.log가 변화하면, input으로부터 정보를 받아서, line 형식으로 출력합니다. 파이프라인 2번입니다. 우리는 파이프라인 2개를 logstash에 넘겨주면 됩니다.

 

 

 pipelines.yml에 위와 같이 입력해 줍니다. path.config와 pipeline.id가 중요합니다. 위 파일에서는 /etc/logstash/logstash-1.conf에 정의된 파이프라인 test1과, /etc/logstash/logstash-2.conf에 정의된 파이프라인 test2를 정의했습니다. 요렇게 입력해 주고, -f 옵션 없이 logstash를 실행시켜 보겠습니다. 

 

 저는 1.log에 "12345"를, 2.log에 "12345"를 입력하였습니다. 결과는 어떻게 나왔을까요?

 

 

 1.log로부터 온 것은 rubydebug 형식으로 출력되었습니다.

 

 다음에, 2.log로부터 온 것은 line 형식으로 출력되었습니다. 이렇게 각 source별로 처리 방식이 달라져야 하는 경우, 파이프라인을 분리하는 방법을 고려하는 것이 좋겠습니다.

 

 

 여담으로 pipelines.yml을 설정했는데, 이런 에러가 뜨는 경우가 있습니다. 속 편하게 해당 위치에 pipelines.yml을 만드시고 설정하는 편이 낫겠습니다.