로그 정보를 이용해서 데이터 분석 및 여러가지로 활용할 수 있지만 로그 활용은 그렇게 간단하지만은 않다.
로그 형태가 표준화되어 있지 않기 때문인데, 로그는 반정형 데이터이며 세상의 모든 것이 로그가될 수 있기 때문에 로그 형태를 강제할 방법도 없다. 결국 로그를 수집하는 쪽에서 로그 형태를 분석하고 시스템에서 인식할 수 있도록 로그를 정제하는 작업이 필요한데, 로그스태시는 이 과정을 쉽고 편하게 할 수 있도록 지원한다.
로그스태시를 한페이지로 정리해보자.
로그스태시란?
- 플러그인 기반의 오픈소스 데이터 처리 파이프라인 도구
- 복잡하고 귀찮은 데이터 전처리 과정을 별도 애플리케이션 작성 없이 비교적 간단한 설정만으로 수행할 수 있음(데이터를 저장하기 전 사용자가 원하는 형태로 변경할 수 있음)
- 장애 대응 로직이나 성능 저하 요인을 쉽게 파악할 수 있는 모니터링 API 제공
로그스태시 설치
로그스태시 다운로드
https://www.elastic.co/kr/downloads/logstash
- logstash.yml - 로그스태시 설정 파일
- pipelines.yml - 파이프라인 설정 파일
로그스태시 실행
-- 표준 입력(stdin)으로 전달받은 메시지를 표준 출력(stdout)으로 표시
$ ./logstash -e "input {stdin{}} output{stdout{}}"
로그스태시를 실행하기 위해서는 반드시 파이프라인 설정이 필요하다.
따로 설정파일을 만들거나 config/pipelines.yml에 기록하는데 -e 옵션을 사용하면 콘솔에서 직접 파이프라인을 설정할 수 있다.
파이프라인
- 데이터를 입력받아 실시간으로 변경하고 이를 다른 시스템에 전달하는 역할을 하는 로그스태시의 핵심 기능
- 입력(input), 필터(filter), 출력(output)이라는 세 가지 구성요소로 이루어짐
파이프라인 기본 템플릿
input {
{ 입력 플러그인 }
}
filter {
{ 필터 플러그인 }
}
output {
{ 출력 플러그인 }
}
입력
파이프라인의 가장 앞부분에 위치하며 소스 원본으로부터 데이터를 입력받는 단계
자주 사용하는 입력 플러그인
플러그인 | 설명 |
file | 리눅스의 tail -f 명령처럼 파일을 스트리밍하여 이벤트를 읽어 들인다. |
syslog | 네트워크를 통해 전달되는 시스로그를 수신한다. |
kafka | 카프카의 토픽에서 데이터를 읽어 들인다. |
jdbc | JDCB 드라이버로 지정한 일정마다 쿼리를 실행해 결과를 읽어들인다. |
예제1. file에서 읽어 들이기
input {
file {
path => "/Users/user/elk/elasticsearch-7.16.2/logs/elasticsearch.log"
start_position => "beginning"
}
}
output {
stdout { }
}
예제2. kafka에서 읽어 들이기
input {
kafka {
bootstrap_servers => "127.0.0.1:9092"
group_id => "logstash"
topics => ["apache_logs"]
consumer_threads => 1
decorate_events => true
}
}
output {
stdout { }
}
필터
비정형 데이터를 정형화하고 데이터 분석을 위한 구조를 잡아준다.
필터 플러그인을 이용하여 데이터를 정형화 시킬 수 있다.
플러그인 | 설명 |
grok | gork 패턴을 사용해 메시지를 구조화된 형태로 분석. |
dissect | 간단한 패턴을 사용해 메시지를 구조화된 형태로 분석. grok에 비해 자유도는 떨어지지만 빠름 |
mutate | 필드명을 변경하거나 문자열 처리 등 일반적인 가공 함수들을 제공 |
date | 문자열을 지정한 패턴의 날짜형으로 분석 |
회사에서 grok 을 사용하고 있어 grok 에 대해서 잠깐 알아봄
- https://github.com/logstash-plugins/logstash-patterns-core/blob/main/patterns/ecs-v1/grok-patterns
- 자주 사용하는 정규 표현식들을 패턴화해뒀음
- 패턴을 이용해 %{패턴:필드명} 형태로 데이터에서 특정 파싱할 수 있음
예제 로그
[2020-01-02 14:17] [ID1] 192.10.2.6 9500 [INFO] - connected.
[2020/01/02 14:19:25] [ID2] 218.25.32.70 1070 [warn] - busy server.
예제 필터
filter {
grok {
pattern_definitions => { "MY_TIMESTAMP" => "%{YEAR}[/-]%{MONTHNUM}[/-]%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?" }
match => { "message" => "%{MY_TIMESTAMP:timestamp} * \[%{DATA:id}\] %{IP:ip} %{NUMBER:port:int} \[%{LOGLEVEL:level}\] \- %{DATA:msg}\."}
}
}
- DATA는 모든 데이터를 인식
- []* 모든 공백을 허용
pattern_definitions를 추가하니 파싱에 실패하였다. 패턴정의가 잘못 된 것인지 한번 살펴봐야겠다.
출력
파이프라인의 입력과 필터를 거쳐 가공된 데이터를 지정한 대상으로 내보내는 단계
플러그인 | 설명 |
elasticsearch | bulk API를 사용해 엘라스틱서치에 인덱싱을 수행한다. |
file | 지정한 파일의 새로운 줄에 데이터를 기록한다. |
kafka | 카프카 토픽에 데이터를 기록한다. |
예제. file, elasticsearch 플러그인을 이용하여 출력하기
input {
file {
path => "/Users/user/elk/elasticsearch-7.16.2/logs/elasticsearch.log"
start_position => "beginning"
}
}
output {
file {
path => "/Users/user/elk/elasticsearch-7.16.2/logs/output.log"
}
elasticseach {
index => "output"
}
}
- log를 file input 플러그인으로 읽어들여 file, elasticsearch output 플러그인을 사용하여 내보낸다.
여기까지하면 로그스태시에 대한 내용은 끝
++)
다중 파이프라인
만약 하나의 서버에 존재하는 A app 과 B app의 로그를 하나의 elasticsearch에 보내야한다고 가정해보자. 어떻게 처리할 수 있을까?
- 로그스태시를 여러개 실행하는 방법
- 독립적인 JVM 인스턴스이기 때문에 모니터링이 어렵고 관리가 어려움
- 조건문을 두어 분리하는 방법
- 필터 처리가 복잡해짐
- 다중파이프라인을 활용하는 방법
- 하나의 로그스태시에서 여러 개의 파이프라인을 동작시킨다. (제일 좋은..?)
이렇게 3가지 방법이 존재하겠다. 예전에는 로그스태시를 여러개 실행하는 방법으로 문제를 해결하였으나 .. 다중 파이프라인을 사용하면 된다.
몇 버전부터 나온 기능인지는 정확히 모르겠으나, 5.x 버전에서는 지원하지 않는 것으로 보인다.
pipielines.yml
- pipieline.id: mypipe1
path.config: "/logstash-7.10.1/config/mypipe1.conf"
- pipeline.id: mypipie2
path.config : "/logstash-7.10.1/config/mypipe2.conf"
로그스태시를 실행하면 기본적으로 pipelines.yml에 정의되어 있는 파이프라인을 인식한다. -f 옵션 사용하면 사용자가 지정한 파이프라인을 사용하게 된다. 2개의 conf 파일을 읽어 사용할 수 있다.
++)
java 8 - logstash 5.6
logstash 7 이상은 java8과 호환이 안되는 듯?
출처 및 참고) 엘라스틱 스택 개발부터 운영까지
'프로그래밍 노트 > 인프라' 카테고리의 다른 글
[엘라스틱 서치] 매핑과 인덱스 템플릿 (0) | 2022.01.03 |
---|---|
[엘라스틱 서치] 인덱스와 도큐먼트란 무엇인가?? (0) | 2022.01.03 |
[엘라스틱 스택] 맥북 실습 환경 구성 (0) | 2021.12.30 |
[엘라스틱 스택] 엘라스틱 스택 찍먹하기 (0) | 2021.12.23 |
[kafka] 카프카 프로듀서 주요 옵션 및 전송방법 (0) | 2021.08.09 |