로그 파싱하기
로그 파서를 사용하면 불규칙한 형태의 로그를 쿼리가 가능한 구조화된 형태로 변경할 수 있습니다. 와탭 로그 모니터링은 다음과 같이 두 가지 유형의 파서를 제공합니다.
-
GROK 파서: 임의의 형태로 수집되는 로그를 정규 표현식과 GROK 문법을 활용해 파싱합니다.
-
JSON 파서: JSON 형태로 수집되는 로그를 파싱합니다.
공통 주의사항
-
같은 카테고리에 여러 개의 파서가 등록되어 있는 경우 첫 번째로 매칭되는 파서만 적용됩니다.
-
와탭은 와탭 서비스의 안정성 에 영향을 줄 수 있는 파서를 비활성화할 수 있는 권한을 가집니다.
GROK 파서
로그가 불규칙한 형태로 수집되는 경우 GROK 파서를 사용해 로그를 파싱할 수 있습니다. GROK 문법은 named regular expressions를 제공해 정규 표현식을 보다 쉽고 편리하게 사용할 수 있습니다.
GROK 파서 패턴 등록에 관해 다음 동영상 가이드를 참조하세요.
GROK 시작하기
GROK은 두 가지 형태의 문법을 제공합니다.
-
%{SYNTAX:SEMANTIC}
: GROK 라이브러리에서 제공하는 문법입니다. named regular expressions를 활용해 태그를 추출할 수 있습니다. 활용 예시는 다음을 참조하세요.-
SYNTAX: GROK이 제공하는 named regular expressions를 지정합니다.
-
SEMANTIC: 매칭되는 값에 부여할 이름을 지정합니다.
노트named regular expressions
GROK에서 제공하는 문법입니다. 복잡한 정규 표현식에 이름을 부여해 사용할 수 있도록 GROK에서 제공하는 기능입니다.
name regular expression WORD \b\w+\b
SPACE \s*
NOTSPACE \S+
UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}
와탭에서 제공하는 모든 named regular expressions 확인을 원한다면 다음 링크를 참조하세요.
-
-
(?<SEMANTIC>REGX)
: 정규 표현식의 named capturing group 문법입니다. 정규 표현식을 활용해서 사용자의 의도에 맞게 태그를 추출할 수 있습니다. 활용 예시는 다음을 참조하세요.-
SEMANTIC: 매칭되는 값에 부여할 이름을 지정합니다.
-
REGX: 매칭에 사용할 정규 표현식을 입력합니다.
노트named capturing group
정규 표현식에서 제공하는 문법입니다.
-
capturing group: 여러 개의 토큰을 하나로 묶어 하나의 매칭 단위로 사용하는 기능을 의미합니다.
-
named capturing group: capturing group에 이름을 부여한 것입니다.
-
문자열 매칭 예시를 살펴보겠습니다. dev@whatap.io
- 예시 1
(\w+)@(\w+\.\w+)
- 예시 2 이메일 전체 매칭 및 username과 domain 추가 매칭 시
(?<username>\w+)@(?<domain>\w+\.\w+)
- 예시 1
-
%{SYNTAX:SEMANTIC}
활용 예시
다음은 %{SYNTAX:SEMANTIC}
문법을 활용하는 예시입니다.
[2023-08-08 02:02:30,101 GMT][INFO ][i.w.y.l.c.LogSinkDexScheduleThread.realProcess(159)] 8 VirtualLog 20230808 02:01:00.000 {area=4, city=5} 56ms
샘플 로그를 보고 각 단어가 의미하는 내용을 유추할 수 있습니다. 각 부분을 semantic한 단어로 치환 시 다음과 같이 표현할 수 있습니다.
[date][logLevel][caller] projectCode logCategiry dexBuildStartTime {area=areaEnum, city=cityEnum} dexBuildElapsed
semantic한 단어 모두 정규 표현식으로 대체할 수 있습니다. GROK 파서를 사용하면 사전 정의된 named regular expressions를 활용할 수 있습니다. 여기서 사용된 TIMESTAMP_ISO8601
, LOGLEVEL
, DATA
는 GROK에서 제공하는 named regular expressions입니다. 이 값들은 각각 다음의 정규 표현식으로 대체되어 매칭됩니다.
-
name:
TIMESTAMP_ISO8601
- regular expression:
%{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
- regular expression:
-
name:
LOGLEVEL
- regular expression:
LOGLEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo|INFO|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
- regular expression:
-
name:
DATA
- regular expression:
.*?
- regular expression:
\[%{TIMESTAMP_ISO8601:date}\sGMT\]\[%{LOGLEVEL:level}\s\]\[%{DATA:caller}\]
위와 같은 문법으로 파싱을 하면 다음과 같이 태그를 추출할 수 있습니다. 이렇게 GROK의 %{SYNTAX:SEMANTIC}
문법은 복잡하고 긴 정규 표현식을 쉽고 간결하게 적용할 수 있도록 도와주는 역할을 합니다.
- date : 2023-08-08 02:02:30,101
- caller : i.w.y.l.c.LogSinkDexScheduleThread.realProcess(159)
- level : LEVEL
(?<SEMANTIC>REGX)
활용 예시
named regular expressions로 매칭되지 않는 부분은 (?<SEMANTIC>REGX)
패턴을 사용해서 파싱할 수 있습니다. 위의 샘플 로그에서 %{SYNTAX:SEMANTIC}
문법만으로 파싱되지 않는 영역은 다음과 같습니다.
8 VirtualLog 20230808 02:01:00.000 {area=4, city=5} 56ms
해당 로그의 각 부분을 semantic한 단어로 치환 시 다음과 같이 표현할 수 있습니다.
projectCode logCategiry dexBuildStartTime {area=areaEnum, city=cityEnum} dexBuildElapsed
이렇게 불규칙한 형태의 문자열은 다음과 같은 (?<SEMANTIC>REGX)
문법을 사용해 파싱할 수 있습니다.
샘플 로그 파싱 키워드별 매칭되는 정규 표현식
파싱 키워드 | (?<SEMANTIC>REGX) |
---|---|
8 | (?<projectCode>\d) |
VirtualLog | (?<logCategory>\w*) |
20230808 02:01:00.000 | (?<dexBuildStartTime>\d{8}\s\d{2}:\d{2}:\d{2}\.\d{3}) |
area=4 | area=(?<areaEnum>\d) |
city=5 | city=(?<cityEnum>\d) |
56ms | (?<dexBuildElapsed>\d{2})ms |
기본 정규 표현식 문법
문법 | 의미 | 별칭 |
---|---|---|
? | 0 or 1 | - |
+ | 1 or more | - |
* | 0 or more | - |
a{5} | exactly 5 | - |
\w | word character | [a-zA-Z_0-9] |
\s | white space | - |
. | any character except newline | |
[abc] | any of | - |
[^abc] | not a,b, or c | - |
[a-z] | character between a and z | - |
[1-3[7-9]] | union (combining two or more character classes) | - |
[1-6&&[3-9]] | intersection (교집합) | - |
[0-9&&[^2468]] | subtraction (차집합) | - |
a{2,} | 2 or more | - |
a{1,3} | between 1 and 3 | - |
a+? | match as few as possible | - |
{2,3}? | match as few as possible | - |
(abc) | capturing group (여러 개의 문자 열을 single unit으로 처리함) | - |
\d | digit | [0-9] |
\D | non-digit | [^0-9] |
\W | non-word character | - |
\S | non-white space | - |
이렇게 파싱된 키워드를 띄어쓰기(\s
)와 특수 문자 escape(\{
, \,
, \}
)로 연결하면 다음과 같이 패턴을 적용할 수 있습니다.
(?<projectCode>\d)\s(?<logCategory>\w*)\s(?<dexBuildStartTime>\d{8}\s\d{2}:\d{2}:\d{2}\.\d{3})\s\{area=(?<areaEnum>\d),\scity=(?<cityEnum>\d)\}\s(?<dexBuildElapsed>\d{2})ms
위와 같은 문법으로 파싱을 하면 다음과 같이 태그를 추출할 수 있습니다.
- projectCode : 8
- logCategory : VirtualLog
- dexBuildStartTime : 20230808 02:01:00.000
- areaEnum : 4
- cityEnum : 5
- dexBuildElapsed : 56
GROK 적용하기
로그 설정 > 로그 1차 파서 설정
-
GROK 패 턴 파서를 적용하려면 로그 설정 메뉴의 로그 1차 파서 설정 탭으로 이동하세요.
-
+ 추가하기를 선택 후 파서 입력란에서 GROK 파서를 선택하세요.
-
패턴 등록 버튼 선택 시 오른쪽에 패턴 등록 및 시뮬레이션 창이 나타납니다.
-
패턴과 로그 입력 후 시뮬레이션 버튼을 클릭하여 적용하려는 패턴으로 파싱에 성공하는지 확인하세요.
패턴 예시:
\[%{TIMESTAMP_ISO8601:date}\sGMT\]\[%{LOGLEVEL:level}\s\]\[%{DATA:caller}\]\s(?<projectCode>\d)\s(?<logCategory>\w*)\s(?<dexBuildStartTime>\d{8}\s\d{2}:\d{2}:\d{2}\.\d{3})\s\{area=(?<areaEnum>\d),\scity=(?<cityEnum>\d)\}\s(?<dexBuildElapsed>\d{2})ms
로그 예시:
[2023-08-08 02:02:30,101 GMT][INFO ][i.w.y.l.c.LogSinkDexScheduleThread.realProcess(159)] 8 VirtualLog 20230808 02:01:00.000 {area=4, city=5} 56ms
-
시뮬레이션 성공 시 시뮬레이션 결과 및 퍼포먼스 측정 결과를 조회할 수 있습니다.
-
시뮬레이션 후 패턴 적용 버튼 클릭 시 선택한 파서에 입력한 패턴이 적용됩니다.
-
패턴 적용 후 카테고리 및 로그 검출 조건, 패턴을 입력하세요.
-
카테고리
로그 카테고리를 선택하세요. 카테고리는 필수로 입력해야 합니다.
-
로그 검출 조건
-
조건에 만족하는 로그만 파서가 적용됩니다.
-
검색 키와 검색 값을 선택하거나 직접 입력하세요.
-
로그 검출 조건은 모든 파서가 수행되기 전에 적용됩니다. 즉 파서의 결과로 추가되는 태그를 사용할 수 없습니다.
-
-
카테고리
-
추가 버튼을 선택해 파서를 등록하세요.
-
로그 파서 목록에서 해당 파서의