로그 파싱하기
로그 파서를 사용하면 불규칙한 형태의 로그를 쿼리가 가능한 구조화된 형태로 변경할 수 있습니다. 와탭 로그 모니터링은 다음과 같이 두 가지 유형의 파서를 제공합니다.
-
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: 매칭되는 값에 부여할 이름을 지정합니다.
Notenamed 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: 매칭에 사용할 정규 표현식을 입력합니다.
Notenamed 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 적용하기
Log Configuration > Log primary parser setting
-
GROK 패턴 파서를 적용하려면 Log Configuration 메뉴의 Log primary parser setting 탭으로 이동하세요.
-
+ Add를 선택 후 Parser 입력란에서 GROK 파서를 선택하세요.
-
Register pattern 버튼 선택 시 오른쪽에 패턴 등록 및 시뮬레이션 창이 나타납니다.
-
Pattern과 Log 입력 후 Simulation 버튼을 클릭하여 적용하려는 패턴으로 파싱에 성공하는지 확인하세요.
Pattern 예시:
\[%{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
Log 예시:
[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
-
시뮬레이션 성공 시 Simulation result 및 Performance measurement results를 조회할 수 있습니다.
-
시뮬레이션 후 Apply pattern 버튼 클릭 시 선택한 파서에 입력한 패턴이 적용됩니다.
-
패턴 적용 후 Category 및 Log detection condition, Pattern을 입력하세요.
-
Category
로그 카테고리를 선택하세요. Category는 필수로 입력해야 합니다.
-
Log detection condition
-
조건에 만족하는 로그만 파서가 적용됩니다.
-
Search key와 Search value을 선택하거나 직접 입력하세요.
-
Log detection condition은 모든 파서가 수행되기 전에 적용됩니다. 즉 파서의 결과로 추가되는 Tag를 사용할 수 없습니다.
-
-
Category
-
Add 버튼을 선택해 파서를 등록하세요.
-
로그 파서 목록에서 해당 파서의 Priority를 변경하거나 Enable 및 Edit, Delete할 수 있습니다.
-
파서 시뮬레이션 후 패턴을 등록할 수 있습니다.
GROK 파서 주의사항
-
GROK 파서는
%{SYNTAX:SEMANTIC}
,%{SYNTAX:SEMANTIC}
두 가지 패턴을 지원합니다. -
%{SYNTAX:SEMANTIC}
패턴 사용 시SEMANTIC
을 반드시 입력해야합니다. -
%{SYNTAX:SEMANTIC}
패턴 사용 시SEMANTIC
은 하나의 파서 안에서 unique 해야합니다. -
(?<SEMANTIC>REGX)
패턴 사용 시SEMANTIC
은 문자(a-z, A-Z)와 숫자(0-9) 그리고 지정된 특수문자(.
,_
,-
)만 올 수 있습니다. -
SEMANTIC
은 문자(a-z, A-Z)로 시작해야 합니다. -
SEMANTIC
은 문자(a-z, A-Z) 또는 숫자(0-9)로 끝나야 합니다.
JSON 파서
로그가 JSON 포맷으로 수집될 경우 JSON 파서를 사용해 쉽고 편리하게 파싱할 수 있습니다.
JSON 적용하기
Log Configuration > Log primary parser setting
-
JSON 패턴 파서를 적용하려면 Log Configuration 메뉴의 Log primary parser setting 탭으로 이동하세요.
-
+ Add를 선택 후 Parser 입력란에서 JSON 파서를 선택하세요.
-
Register pattern 버튼 선택 시 오른쪽에 패턴 등록 및 시뮬레이션 창이 나타납니다.
-
Pattern과 Log 입력 후 Simulation 버튼을 클릭하여 적용하려는 패턴으로 파싱에 성공하는지 확인하세요.
Example2023-08-08 02:43:28,615 -- {"host":"10.21.3.24","method":"POST","status":"200","url":"http://devote.whatap.io/yard/api/flush"} --
예시 로그에서 Prefix와 Postfix를
--
로 지정하고 Ignore에url
을 지정 시host
,method
,status
3개의 Tag만 생성됩니다.-
Prefix
로그에서 JSON 포맷이 시작하는 위치를 지정합니다. 로그 전체가 JSON 포맷인 경우 빈 값으로 설정합니다. -
Postfix
로그에서 JSON 포맷이 끝나는 위치를 지정합니다. 로그 전체가 JSON 포맷인 경우 빈 값으로 설정합니다. -
Ignore
JSON 포맷 중 태그를 생성하지 않을 키를 지정합니다.
-
-
시뮬레이션 성공 시 Simulation result 및 Performance measurement results를 조회할 수 있습니다.
-
시뮬레이션 후 Apply pattern 버튼 클릭 시 선택한 파서에 입력한 패턴이 적용됩니다.
-
패턴 적용 후 Category 및 Log detection condition, Pattern을 입력하세요.
-
Category
로그 카테고리를 선택하세요. Category는 필수로 입력해야 합니다.
-
Log detection condition
-
조건에 만족하는 로그만 파서가 적용됩니다.
-
Search key와 Search value을 선택하거나 직접 입력하세요.
-
Log detection condition은 모든 파서가 수행되기 전에 적용됩니다. 즉 파서의 결과로 추가되는 Tag를 사용할 수 없습니다.
-
-
Category
-
Add 버튼을 선택해 파서를 등록하세요.
-
로그 파서 목록에서 해당 파서의 Priority를 변경하거나 Enable 및 Edit, Delete할 수 있습니다.
-
파서를 등록하기 전에 Simulation을 통해 등록하려는 패턴이 정상적인지 확인할 수 있습니다. GROK 파서 등록 시뮬레이션 과정과 동일합니다. 다음 문서를 참조하세요.
JSON 포맷 활용 예시
{"host":"10.21.3.24","method":"POST","status":"200","url":"http://devote.whatap.io/yard/api/flush"}
위와 같은 샘플 로그가 수집된 경우 Parser Add 창에서 JSON 파서를 선택하세요. 복잡한 파싱 로직을 작성할 필요없이 로그 분석에 필요한 Tag를 다음과 같이 추출할 수 있습니다.
- host : 10.21.3.24
- method : POST
- status : 200
- url : http://dev.whatap.io/yard/api/flush
JSON 포맷 일부 구성 시 활용 예시
2023-08-08 02:43:28,615 -- {"host":"10.21.3.24","method":"POST","status":"200","url":"http://devote.whatap.io/yard/api/flush"} --
만약 예시와 같이 로그의 일부만 JSON 포맷으로 구성되어있다면 Prefix와 Postfix를 지정해 주세요. 와탭 로그 모니터링은 Prefix와 Postfix 사이의 영역을 JSON 포맷으로 인식 후 파싱합니다.
- host : 10.21.3.24
- method : POST
- status : 200
- url : http://dev.whatap.io/yard/api/flush