Skip to main content

로그 파싱하기

Not translated
This page is currently being translated. We will complete the translation as soon as possible.

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

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

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

Note

공통 주의사항

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

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

GROK 파서

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

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

GROK 시작하기

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

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

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

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

    Note

    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: 매칭에 사용할 정규 표현식을 입력합니다.

    Note

    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 적용하기

Log Configuration > Log primary parser setting

  1. GROK 패턴 파서를 적용하려면 Log Configuration 메뉴의 Log primary parser setting 탭으로 이동하세요.

    로그 파서 목록

  2. + Add를 선택 후 Parser 입력란에서 GROK 파서를 선택하세요.

    로그 파서 추가

  3. Register pattern 버튼 선택 시 오른쪽에 패턴 등록 및 시뮬레이션 창이 나타납니다.

  4. PatternLog 입력 후 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

  5. 시뮬레이션 성공 시 Simulation resultPerformance measurement results를 조회할 수 있습니다.

    파서 시뮬레이션 및 퍼포먼스 측정

  6. 시뮬레이션 후 Apply pattern 버튼 클릭 시 선택한 파서에 입력한 패턴이 적용됩니다.

  7. 패턴 적용 후 CategoryLog detection condition, Pattern을 입력하세요.

    GROK 파서 입력

    • Category

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

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

      • Search keySearch value을 선택하거나 직접 입력하세요.

      • Log detection condition은 모든 파서가 수행되기 전에 적용됩니다. 즉 파서의 결과로 추가되는 Tag를 사용할 수 없습니다.

  8. Add 버튼을 선택해 파서를 등록하세요.

Note
  • 로그 파서 목록에서 해당 파서의 Priority를 변경하거나 EnableEdit, Delete할 수 있습니다.

  • 파서 시뮬레이션 후 패턴을 등록할 수 있습니다.

Note

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

  1. JSON 패턴 파서를 적용하려면 Log Configuration 메뉴의 Log primary parser setting 탭으로 이동하세요.

    로그 파서 목록

  2. + Add를 선택 후 Parser 입력란에서 JSON 파서를 선택하세요.

    로그 파서 추가

  3. Register pattern 버튼 선택 시 오른쪽에 패턴 등록 및 시뮬레이션 창이 나타납니다.

  4. PatternLog 입력 후 Simulation 버튼을 클릭하여 적용하려는 패턴으로 파싱에 성공하는지 확인하세요.

    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--로 지정하고 Ignoreurl을 지정 시 host, method, status 3개의 Tag만 생성됩니다.

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

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

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

  5. 시뮬레이션 성공 시 Simulation resultPerformance measurement results를 조회할 수 있습니다.

    파서 시뮬레이션 및 퍼포먼스 측정

  6. 시뮬레이션 후 Apply pattern 버튼 클릭 시 선택한 파서에 입력한 패턴이 적용됩니다.

  7. 패턴 적용 후 CategoryLog detection condition, Pattern을 입력하세요.

    Json 파서 입력

    • Category

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

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

      • Search keySearch value을 선택하거나 직접 입력하세요.

      • Log detection condition은 모든 파서가 수행되기 전에 적용됩니다. 즉 파서의 결과로 추가되는 Tag를 사용할 수 없습니다.

  8. Add 버튼을 선택해 파서를 등록하세요.

Note
  • 로그 파서 목록에서 해당 파서의 Priority를 변경하거나 EnableEdit, Delete할 수 있습니다.

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

JSON 포맷 활용 예시

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

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

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