본문으로 건너뛰기

로그 파싱하기

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

  • 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 logCategory 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 logCategory 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 파서를 선택하세요.

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

  4. 패턴로그 입력 후 시뮬레이션 버튼을 클릭하여 적용하려는 패턴으로 파싱에 성공하는지 확인하세요.

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

  5. 시뮬레이션 성공 시 시뮬레이션 결과퍼포먼스 측정 결과를 조회할 수 있습니다.

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

  7. 패턴 적용 후 카테고리로그 검출 조건, 패턴을 입력하세요.

    GROK 파서 입력

    • 카테고리

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

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

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

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

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

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

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

노트

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

GROK 추가 패턴 선택하기

GROK 파서 시뮬레이션 시 기본 패턴(WORD, NUMBER, IP 등) 외에 특정 로그 형식에 맞는 추가 패턴을 선택할 수 있습니다. Java, Nginx, MySQL 등 32개 패턴 타입이 11개 카테고리로 그룹핑되어 제공됩니다.

추가 패턴 카테고리 드롭다운

  1. 파서 시뮬레이션 창에서 추가 패턴 (선택) 영역의 드롭다운을 클릭하세요.

  2. 카테고리별로 그룹핑된 패턴 타입 목록에서 필요한 패턴 타입을 선택하세요. 검색 입력란에 패턴 타입 이름 또는 설명을 입력해 검색할 수도 있습니다.

  3. 선택한 패턴 타입은 시뮬레이션 시 기본 패턴과 함께 로드됩니다.

노트

기본 패턴(Core)은 항상 자동으로 포함됩니다. 추가 패턴 선택은 선택 사항입니다.

카테고리별 패턴 타입 목록

카테고리패턴 타입
Web Servershaproxy, httpd, iis, nginx, squid
Application Servers & Frameworksjava, log4j, rails, ruby, springboot
Databasesmongodb, mysql, oracle, postgresql, redis
Cloudaws
System & Infrastructuredocker, kubernetes, linux-syslog
Messaging & Searchelasticsearch, kafka
Network & Securitybind, bro, firewalls, junos, zeek
Mailexim, postfix
Monitoring & Backupbacula, mcollective, nagios
Build Toolsmaven

활용 예시

Tomcat Catalina 8 로그를 파싱하려면 java 패턴 타입을 추가로 선택한 뒤 %{CATALINA8_LOG} 패턴을 사용하세요.

Sample log
31-Jul-2020 16:40:38 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/8.5.57
GROK parsing pattern
%{CATALINA8_LOG}
Tag extraction
- log_timestamp : 31-Jul-2020 16:40:38
- log.level : INFO
- java.log.origin.thread.name : main
- java.log.origin.class.name : org.apache.catalina.startup.VersionLoggerListener
- log.origin.function : log
- log_message : Server version name: Apache Tomcat/8.5.57

패턴 상세 보기

선택한 추가 패턴 타입에 어떤 패턴이 포함되어 있는지 상세 창에서 확인할 수 있습니다. 패턴 정의(정규 표현식)와 샘플 로그를 조회하고 시뮬레이션에 바로 적용할 수 있습니다.

패턴 상세 보기

추가 패턴 타입을 선택한 뒤 선택된 패턴 타입 태그를 클릭하면 오른쪽에 상세 창이 열립니다. 상세 창은 시뮬레이션 폼을 가리지 않고 나란히 표시되므로, 패턴 정의를 확인하면서 시뮬레이션을 진행할 수 있습니다.

각 패턴 항목에서 다음 기능을 사용할 수 있습니다.

버튼기능설명
샘플샘플 로그 입력해당 패턴에 매칭되는 예시 로그를 시뮬레이션 파싱 로그 입력란에 자동으로 입력합니다.
선택패턴 삽입%{패턴이름} 형식으로 패턴 입력란에 삽입합니다. 해당 패턴 타입도 자동으로 선택됩니다.
복사클립보드 복사%{패턴이름} 형식을 클립보드에 복사합니다.
노트
  • 패턴 항목을 클릭하면 패턴 정의(정규 표현식)가 펼쳐집니다. 여러 패턴을 동시에 펼쳐 정의를 비교할 수 있습니다.

  • 패턴 정의에 포함된 %{PATTERN:field} 참조는 패턴 이름, 필드명, 리터럴 문자가 서로 다른 색상으로 구분되어 표시됩니다.

  • 샘플 버튼으로 입력된 로그로 바로 시뮬레이션을 실행해 파싱 결과를 확인할 수 있습니다.

시뮬레이션 샘플 로그 저장

시뮬레이션에 사용한 로그는 파서 설정과 함께 자동으로 저장됩니다. 파서를 수정할 때 이전에 사용한 샘플 로그가 시뮬레이션 창에 자동으로 복원되어 매번 로그를 다시 입력할 필요가 없습니다.

JSON 파서

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

JSON 적용하기

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

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

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

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

  4. 패턴로그 입력 후 시뮬레이션 버튼을 클릭하여 적용하려는 패턴으로 파싱에 성공하는지 확인하세요.

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

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

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

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

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

  5. 시뮬레이션 성공 시 시뮬레이션 결과퍼포먼스 측정 결과를 조회할 수 있습니다.

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

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

  7. 패턴 적용 후 카테고리로그 검출 조건, 패턴을 입력하세요.

    Json 파서 입력

    • 카테고리

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

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

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

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

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

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

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

JSON 포맷 활용 예시

Sample log
{"host":"10.21.3.24","method":"POST","status":"200","url":"http://dev.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://dev.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