파이프라인
데이터를 입력받아 실시간으로 변경하고 이를 다른 시스템에 전달하는 역할
입력, 필터, 출력의 3가지 옵션으로 이루어져 있으며 필터에 다양한 옵션이 있는데 그 중 Grok pattern을 사용하는 법에 대해 정리해보려고 한다.
입력 플러그인은 file, syslog, kafka, jdbc 등의 플러그인으로 데이터를 받아온다.
필터 플러그인은 grok, dissect, mutate, date 등의 플러그인으로 데이터를 필터링 한다.
Grok Pattern - 예악어 활용
Grok은 정규 표현식을 이용해 문자열을 파싱할 수 있다. 자주 사용하는 정규 표현식들을 패턴화해뒀으며 패턴을 이용해
%{패턴명:변수명} 형태로 데이터에서 특정 필드를 파싱할 수 있다.
패턴명 | 설명 |
NUMBER | 십진수를 인식한다. 부호와 소수점을 포함할 수 있다. |
SPACE | 스페이스, 탭 등 하나 이상의 공백을 인식한다. |
URI | URI를 인식한다. 프로토콜, 인증 정보, 호스트, 경로, 파라미터를 포함할 수 있다. |
IP | IP 주소를 인식한다. IPv4나 IPv6를 모두 인식할 수 있다. |
SYSLOBASE | 시스로그의 일반적인 포맷에서 타임스탬프, 중요도, 호스트, 프로세스 정보까지 메시지외의 헤더 부분을 인식한다. |
TIMESTAMP_ISO86701 | ISO8601 포맷의 타임스탬프를 인식한다. 2020-01-01T12:00:00+09:00과 같은 형태이며, 타임존까지 정확한 정보를 기록하고 로그에선 많이 쓰이는 날짜 포맷이기에 유용하다 |
DATA | 이 패턴의 직전 패턴부터 다음 패턴 사이를 모두 인식한다. 특별히 인식하고자 하는 값의 유형을 신경 쓸 필요가 없으므로 특별히 값이 검증될 필요가 없다면 가장 많이 쓰이는 패턴 중 하나이다. |
GREENYDATA | DATA 타입과 동일하나, 표현식의 가장 뒤에 위치시킬 경우 해당 위치부터 이벤트의 끝까지를 값으로 인식한다. |
- '[' , ']', '-', '.'과 같은 기호는 백슬래시(\)를 붙여 이스케이프 할 수 있다.
.* .*?와 같은 표현은 왜 넣는걸까?
{%예약어:필드명} 이렇게 사용하면 무조껀 데이터를 매핑한다는건데 필요없는 데이터를 굳이 매핑하고 싶지 않을때도 있기 때문에 그냥 정규식으로 넘겨버릴때 사용한다.
Grok Pattern - 정규식 활용(?<field>REGEX)
Logstash 의 텍스트 파싱에 활용되는 주요 정규표현식은 다음과 같습니다.
\w | 문자 하나를 나타내는 패턴 (word) |
\w+ | 문자 여러개 |
\d | 숫자 하나를 나타내는 패턴 (digit) |
\d+ | 숫자 여러개 |
\s | 공백 하나를 나타내는 패턴 (space) |
\s+ | 공백 여러개 |
\특수기호 | 특수기호를 나타내는 패턴 (\ 를 통해 Escape) |
위의 SYNTAX 예시에 활용된 Sample Data 를 정규표현식을 활용하여 필드 추출 테스트를 진행하면
자세하고 더 많은 관련 패턴 설명은 아래 사이트를 참조한다.
EX1)
08 10:52:49.922 [INFO ] [tokenInfo] <141998> action=test action data, desc=신용카드빌링승인요청API, result={TEST result}
위처럼 입력으로 받은 데이터를 아래와 같은 Grok Pattern을 사용하여 데이터를 구조화 시키면
%{NUMBER:day} %{TIME:time} \[%{LOGLEVEL:loglevel}.*\] \[%{DATA:token}\] <%{NUMBER:lognumber}> action=%{DATA:action}, desc=%{DATA:desc}, result=\{%{GREEDYDATA:result}\}
다음과 같은 구조화된 데이터가 만들어진다.
{
"result": "TEST result",
"lognumber": "141998",
"loglevel": "INFO",
"action": "test action data",
"time": "10:52:49.922",
"day": "08",
"token": "tokenInfo",
"desc": "신용카드빌링승인요청API"
}
EX2)
Mar 8 15:35:18 nmail02 postfix/qmgr[6555]: 3BBF9B74E: removed
%{SYSLOGTIMESTAMP:timestamp} %{DATA:host} %{DATA:dataset}/%{DATA:protocol}\[%{NUMBER:code}\]: %{GREEDYDATA:body}
'DevOps > ELK' 카테고리의 다른 글
[Elastic Stack] Elasticsearch Command line tools (2) | 2024.03.19 |
---|---|
[Elastic Stack] Elasticsearch.yml 파일 세팅 (0) | 2024.03.18 |
[Elastic Stack] Ingest Pipeline + processor (0) | 2024.03.14 |
[Elastic Stack] Fleet and Elastic Agent (0) | 2024.03.12 |
[Elastic Stack] 검색어 자동완성 구현(Spring Data Elasticsearch) (0) | 2023.05.04 |