본문으로 건너뛰기

로그 파싱하기

로그 파서를 사용하면 불규칙한 형태의 로그를 쿼리가 가능한 구조화된 형태로 변경할 수 있습니다. 와탭 로그 모니터링은 다음과 같이 두 가지 유형의 파서를 제공합니다.

  • GROK 파서: 임의의 형태로 수집되는 로그를 정규 표현식과 GROK 문법을 활용해 파싱합니다.

  • JSON 파서: JSON 형태로 수집되는 로그를 파싱합니다.

노트

공통 주의사항

  • 같은 카테고리에 여러 개의 파서가 등록되어 있는 경우 첫 번째로 매칭되는 파서만 적용됩니다.

  • 와탭은 와탭 서비스의 안정성에 영향을 줄 수 있는 파서를 비활성화할 수 있는 권한을 가집니다.

GROK 파서

로그가 불규칙한 형태로 수집되는 경우 GROK 파서를 사용해 로그를 파싱할 수 있습니다. GROK 문법은 named regular expressions를 제공해 정규 표현식을 보다 쉽고 편리하게 사용할 수 있습니다.

GROK 파서 패턴 등록에 관해 다음 동영상 가이드를 참조하세요.

GROK 시작하기

GROK은 두 가지 형태의 문법을 제공합니다.

  1. %{SYNTAX:SEMANTIC}: GROK 라이브러리에서 제공하는 문법입니다. named regular expressions를 활용해 태그를 추출할 수 있습니다. 활용 예시는 다음을 참조하세요.

    • SYNTAX: GROK이 제공하는 named regular expressions를 지정합니다.

    • SEMANTIC: 매칭되는 값에 부여할 이름을 지정합니다.

    노트

    named regular expressions

    GROK에서 제공하는 문법입니다. 복잡한 정규 표현식에 이름을 부여해 사용할 수 있도록 GROK에서 제공하는 기능입니다.

    nameregular 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 확인을 원한다면 다음 링크를 참조하세요.

  2. (?<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+)

%{SYNTAX:SEMANTIC} 활용 예시

다음은 %{SYNTAX:SEMANTIC} 문법을 활용하는 예시입니다.

Sample 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

샘플 로그를 보고 각 단어가 의미하는 내용을 유추할 수 있습니다. 각 부분을 semantic한 단어로 치환 시 다음과 같이 표현할 수 있습니다.

semantic replace
[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}?
  • 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)?)
  • name: DATA

    • regular expression: .*?
GROK parsing pattern
\[%{TIMESTAMP_ISO8601:date}\sGMT\]\[%{LOGLEVEL:level}\s\]\[%{DATA:caller}\]

위와 같은 문법으로 파싱을 하면 다음과 같이 태그를 추출할 수 있습니다. 이렇게 GROK의 %{SYNTAX:SEMANTIC} 문법은 복잡하고 긴 정규 표현식을 쉽고 간결하게 적용할 수 있도록 도와주는 역할을 합니다.

Tag extraction
- 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} 문법만으로 파싱되지 않는 영역은 다음과 같습니다.

Unparsed area
8 VirtualLog 20230808 02:01:00.000 {area=4, city=5} 56ms

해당 로그의 각 부분을 semantic한 단어로 치환 시 다음과 같이 표현할 수 있습니다.

semantic replace
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=4area=(?<areaEnum>\d)
city=5city=(?<cityEnum>\d)
56ms(?<dexBuildElapsed>\d{2})ms
기본 정규 표현식 문법
문법의미별칭
?0 or 1-
+1 or more-
*0 or more-
a{5}exactly 5-
\wword character[a-zA-Z_0-9]
\swhite 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으로 처리함)-
\ddigit[0-9]
\Dnon-digit[^0-9]
\Wnon-word character-
\Snon-white space-

이렇게 파싱된 키워드를 띄어쓰기(\s)와 특수 문자 escape(\{, \,, \})로 연결하면 다음과 같이 패턴을 적용할 수 있습니다.

GROK parsing pattern
(?<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

위와 같은 문법으로 파싱을 하면 다음과 같이 태그를 추출할 수 있습니다.

Tag extraction
- projectCode : 8
- logCategory : VirtualLog
- dexBuildStartTime : 20230808 02:01:00.000
- areaEnum : 4
- cityEnum : 5
- dexBuildElapsed : 56

GROK 적용하기

로그 설정 > 로그 1차 파서 설정

  1. GROK 패턴 파서를 적용하려면 로그 설정 메뉴의 로그 1차 파서 설정 탭으로 이동하세요.

    로그 파서 목록

  2. + 추가하기를 선택 후 파서 입력란에서 GROK 파서를 선택하세요.

    GROK 파서 패턴 등록

  3. 카테고리로그 검출 조건, 패턴을 입력하세요. 파서 추가 창의 구성 요소는 다음과 같습니다.

    • 카테고리

      로그 카테고리를 선택하세요. 카테고리는 필수로 입력해야 합니다.

    • 로그 검출 조건

      • 조건에 만족하는 로그만 파서가 적용됩니다.

      • 검색 키검색 값을 선택하거나 직접 입력하세요.

      • 로그 검출 조건은 모든 파서가 수행되기 전에 적용됩니다. 즉 파서의 결과로 추가되는 태그를 사용할 수 없습니다.

    • 패턴

      GROK 패턴을 지정하세요. 필수로 입력해야 합니다.

  4. 추가 버튼을 선택해 파서를 등록하세요.

노트
  • 로그 파서 목록에서 해당 파서의 적용 순서를 변경하거나 활성화수정, 삭제할 수 있습니다.

  • 파서를 등록하기 전에 시뮬레이션을 통해 등록하려는 패턴이 정상적인지 확인할 수 있습니다.

노트

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)로 끝나야 합니다.

시뮬레이션

파서 시뮬레이션 창에서 로그패턴을 입력해 파싱 결과를 미리 확인할 수 있습니다.

로그 예시: [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

패턴 예시: \[%{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

  1. 파서 추가 창에서 시뮬레이션 버튼을 선택하세요.

  2. 파서 시뮬레이션 창에서 로그패턴을 입력하세요.

  3. 로그패턴 입력 후 시뮬레이션 버튼을 선택하세요. 다음과 같이 시뮬레이션 결과를 확인할 수 있습니다.

    GROK 파서 시뮬레이션

JSON 파서

로그가 JSON 포맷으로 수집될 경우 JSON 파서를 사용해 쉽고 편리하게 파싱할 수 있습니다.

JSON 적용하기

로그 설정 > 로그 1차 파서 설정

  1. JSON 패턴 파서를 적용하려면 로그 설정 메뉴의 로그 1차 파서 설정 탭으로 이동하세요.

    로그 파서 목록

  2. + 추가하기를 선택 후 파서 입력란에서 JSON 파서를 선택하세요.

    Json 파서 패턴 등록

  3. 카테고리로그 검출 조건, 패턴을 입력하세요. 파서 추가 창의 구성 요소는 다음과 같습니다.

    • 카테고리

      로그 카테고리를 선택하세요. 카테고리는 필수로 입력해야 합니다.

    • 로그 검출 조건

      • 조건에 만족하는 로그만 파서가 적용됩니다.

      • 검색 키검색 값을 선택하거나 직접 입력하세요.

      • 로그 검출 조건은 모든 파서가 수행되기 전에 적용됩니다. 즉 파서의 결과로 추가되는 태그를 사용할 수 없습니다.

    • 패턴

      • Prefix

        로그에서 JSON 포맷이 시작하는 위치를 지정합니다. 로그 전체가 JSON 포맷인 경우 빈 값으로 설정합니다.

      • Postfix

        로그에서 JSON 포맷이 끝나는 위치를 지정합니다. 로그 전체가 JSON 포맷인 경우 빈 값으로 설정합니다.

      • Ignore

        JSON 포맷 중 태그를 생성하지 않을 키를 지정합니다.

      • JSON 패턴 예시

        Example
        2023-08-08 02:43:28,615 -- {"host":"10.21.3.24","method":"POST","status":"200","url":"http://devote.whatap.io/yard/api/flush"} --

        예시 로그에서 PrefixPostfix--로 지정하고 Ignore--를 지정 시 host, method, status 3개의 태그만 생성됩니다.

  4. 추가 버튼을 선택해 파서를 등록하세요.

노트
  • 로그 파서 목록에서 해당 파서의 적용 순서를 변경하거나 활성화수정, 삭제할 수 있습니다.

  • 파서를 등록하기 전에 시뮬레이션을 통해 등록하려는 패턴이 정상적인지 확인할 수 있습니다. GROK 파서 등록 시뮬레이션 과정과 동일합니다. 다음 문서를 참조하세요.

JSON 포맷 활용 예시

Sample log
{"host":"10.21.3.24","method":"POST","status":"200","url":"http://devote.whatap.io/yard/api/flush"}

위와 같은 샘플 로그가 수집된 경우 파서 추가 창에서 JSON 파서를 선택하세요. 복잡한 파싱 로직을 작성할 필요없이 로그 분석에 필요한 태그를 다음과 같이 추출할 수 있습니다.

Tag extraction
- host : 10.21.3.24
- method : POST
- status : 200
- url : http://dev.whatap.io/yard/api/flush

JSON 포맷 일부 구성 시 활용 예시

Some JSON format sample log
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 포맷으로 구성되어있다면 PrefixPostfix를 지정해 주세요. 와탭 로그 모니터링은 PrefixPostfix 사이의 영역을 JSON 포맷으로 인식 후 파싱합니다.

Tag extraction
- host : 10.21.3.24
- method : POST
- status : 200
- url : http://dev.whatap.io/yard/api/flush