로그 파서 설정
로그 1차 파서 설정
로그 설정 상단의 로그 1차 파서 설정 탭을 선택해 수집된 로그에 대한 파서를 등록할 수 있습니다.
로그 1차 파서는 GROK과 JSON 파서를 제공하며 유형별 로그 발생 수 집계나 특정 로그 탐색을 위한 필수 파서입니다. 패턴 조건에 맞는 검색 키와 검색 값을 추출하며, 파싱된 키는 로그 유형 분류 및 검색 인덱싱에 활용합니다.
-
GROK: 기본은 정규 표현식 기반 파싱에 해당합니다. 예약 키워드 기반의 파싱을 제공합니다.
-
JSON: 로그 중 JSON으로 출력된 부분에 대해서 일괄 파싱을 제공합니다.
파싱 로직 미등록 시 검색 가능한 key
category, oid, oname, okind, okindName, @txid, @login, httphost
파서 등록이 불가한 예약어
timestamp, message, pcode, category, content, logContent
- 다음 예약어의 경우 파서를 등록하더라도 인덱스가 생성되지 않습니다.
로그 파서에 대한 자세한 내용은 다음 문서를 참고하세요.
설정 항목
| 설정 값 | 설명 | 기타 |
|---|---|---|
| 카테고리 | 패턴을 적용할 카테고리 | required |
| 로그 검출 조건 | 필터로 적용할 검색 키, 검색 값을 입력 - 로그 검출 조건에 맞는 로그 데이터에만 패턴 적용, 로그 검출 조건을 입력하지 않으면 모든 로그를 대상으로 패턴 적용 | optional |
| 패턴 | 로그를 파싱(parsing)할 패턴 - 작성한 패턴에 맞추어서 파싱을 하고 인덱스 생성 GROK, 정규 표현식 문법 지원 | required |
파서 목록
등록한 파서를 조회하고, 추가 및 편집할 수 있습니다. 파서는 등록 순서대로 적용되며, 최초로 일치하는 파서만 적용됩니다.
-
상단 오른쪽 + 추가하기 버튼을 클릭하면 파서 추가 창이 나타납니다.
-
적용 순서 컬럼의
아이콘을 드래그해 파서 설정 순서를 변경할 수 있습니다.
-
활성화 토글로 파서 활성화 여부를 지정할 수 있습니다.
-
수정 및
삭제 아이콘을 통해 등록한 파서를 수정 및 삭제할 수 있습니다.
파서 등록
다음은 파서를 등록하는 공통 순서입니다.
-
로그 1차 파서 설정에서 + 추가하기 버튼을 클릭하세요.
-
파서 추가 창에서 파서를 선택하세요.
노트파서 및 패턴 등록 방법
-
GROK 파서 및 패턴 등록
-
JSON 파서 및 패턴 등록
-
-
파서를 선택하면 패턴 등록 버튼이 활성화됩니다. 패턴 등록 버튼을 클릭한 후, 파서 시뮬레이션 창에서 패턴과 로그를 입력하세요.
a. 패턴을 입력하세요.
b. 로그의 카테고리와 시뮬레이션 파싱 로그를 입력하세요. 로그 검색 버튼을 클릭한 후, 검색된 목록에서 원하는 로그 오른쪽의 선택 버튼을 클릭하면 로그가 자동으로 입력됩니다.
노트로그 검색을 통해 수집된 로그 중 예시 로그를 선택할 수 있습니다. 선택한 로 그는 시뮬레이션 입력창에 자동 반영되어 복사/붙여넣기 없이 바로 테스트할 수 있습니다.
c. 등록하려는 패턴이 정상인지 시뮬레이션 버튼을 클릭해 시뮬레이션 및 패턴의 퍼포먼스를 측정하세요.
노트시뮬레이션과 퍼포먼스 측정에 관한 자세한 내용은 다음 문서를 참고하세요.
-
성공적으로 파싱되는지 시뮬레이션 결과를 확인한 후, 패턴 적용 버튼을 클릭하세요.
-
추가 버튼을 클릭하면 파서가 추가됩니다.
개인정보 비식별화
파서 등록 시 검색 키 이름을 검색 키.p로 지정하면 비식별화 대상이 됩니다(예를 들어 myname.p **). 와탭은 개인정보 비식별화 탭에서 비식별화를 관리하는 방식을 권장합니다. 자세한 내용은 개인정보 비식별화를 참고하세요.
GROK 파서 패턴 등록
기본 문법은 %{SYNTAX:SEMANTIC} 입니다. GROK 파서에 대한 자세한 내용은 다음 문서를 참조하세요. 패턴 등록 및 시뮬레이션이 필수적입니다.
-
SYNTAX
GROK 정의 패턴입니다.
-
SEMANTIC
파싱된 데이터에 할당할 키입니다.
노트SEMANTIC에는 예약어 등이 사용되지 않도록 조합어 사용을 권장합니다.
JSON 포맷 파서 패턴 등록
로그 전체 또는 일부가 JSON 형태로 출력되는 경우 해당 부분을 파싱할 수 있습니다. Prefix, Postfix 옵션으로 JSON 인식 범위를 지정합니다. JSON 파서에 대한 자세한 내용은 다음 문서를 참조하세요. 시뮬레이션이 필수적입니다.
| 옵션 | 설명 |
|---|---|
| Prefix | JSON 문자열의 시작 부분 앞의 문자열을 지정합니다. 미지정 시 로그 출력문의 맨 앞부터 JSON 문자열로 식별합니다. |
| Postfix | JSON 문자열의 종료 부분 뒤의 문자열을 지정합니다. 미지정 시 로그 출력문의 맨 뒤까지를 JSON 문자열로 식별합니다. |
| Ignore | JSON 출력부 중 키 추출을 제외할 필드를 지정합니다. |
-
등록 예시
Log[2022-10-25 10:15:34:145]...(개행)
Request : {"key1":"value1","key2":"value2",...}(개행)
Response : {"key3":"value3","key4":"value4",...}예시처럼 유입되는 로그가 Request JSON, Response JSON을 모두 파싱하고자 하는 경우 다음의 2가지 패턴을 등록합니다.
-
Request 파싱용 패턴
"Request : " 와 "Response" 사이의 문자열
{"key1":"value1","key2":"value2",...}대상 -
Response 파싱용 패턴
"Response : " 부터 로그의 마지막 까지의 문자열
{"key3":"value3","key4":"value4",...}대상
-
-
JSON 커스텀 패턴 등록
로그 중 일부가 JSON 형태로 출력되는 경우 JSON으로 출력된 부분을 전용 커스텀 파서를 통해 파싱할 수 있습니다. 패턴을 다음과 같이 입력하세요.
io.whatap.logsink.parser.JsonFormatParser{}로그 중 JSON 형태로 출력된 부분을 검출하기 위해 Prefix, Postfix 옵션을 조합해 로그의 어느 부분을 JSON으로 인식하여 파싱할지 지정하세요.
JsonFormatParser{}의{}에 옵션을 지정합니다.-
등록 예시
Log[2022-10-25 10:15:34:145]...(개행)
Request : {"key1":"value1","key2":"value2",...}(개행)
Response : {"key3":"value3","key4":"value4",...}예시처럼 유입되는 로그가 Request JSON, Response JSON을 모두 파싱하고자 하는 경우 다음의 2가지 패턴을 등록합니다.
- Request 파싱용 패턴
"Request : " 와 "Response" 사이의 문자열
{"key1":"value1","key2":"value2",...}대상io.whatap.logsink.parser.JsonFormatParser {prefix:"Request : ",postfix:"Response"}- Response 파싱용 패턴
"Response : " 부터 로그의 마지막 까지의 문자열
{"key3":"value3","key4":"value4",...}대상io.whatap.logsink.parser.JsonFormatParser {prefix: "Response : "}
-
파서 시뮬레이션 및 퍼포먼스 측정
파서 시뮬레이션 후 패턴을 등록할 수 있습니다. 퍼포먼스 측정은 시뮬레이션 수행 대상 문자열에 대하여 파서의 반복 파싱 소요 시간을 측정합니다.
-
패턴과 로그를 입력하세요. 로그 검색 버튼을 클릭한 후, 검색된 목록에서 원하는 로그 오른쪽의 선택 버튼을 클릭하면 로그가 자동으로 입력됩니다.
-
시뮬레이션 버튼을 클릭하여 등록하려는 패턴으로 파싱에 성공하는지 확인하세요.
-
시뮬레이션 성공 시 시뮬레이션 결과 및 퍼포먼스 측정 결과를 조회할 수 있습니다.
-
시뮬레이션 후 패턴 적용 버튼 클릭 시 선택한 파서에 입력한 패턴이 적용됩니다.
파싱 성공
파싱 로직을 등록해 키(key)가 생성되면 로그 조회 시 해당 키로 파싱된 값이 추가됩니다. 다음 라이브 테일 메뉴 예시와 같이 파싱된 키와 값이 추가됩니다.

파싱된 키는 라이브 테일, 로그 검색, 로그 트렌드에서 확인할 수 있습니다.
로그 2차 파서 설정
로그 설정 메뉴 상단에서 로그 2차 파서 설정 탭을 선택해 로그 파서를 등록할 수 있습니다.
로그 2차 파서는 1차 파서(GROK 또는 JSON)로 추출한 값을 가공해 통계 데이터나 새로운 필드를 생성합니다. HTTP 상태 코드 기반 통계 파서와 함께 키워드 필터, 필드 가공, 응답 시간 분류, GeoIP 변환 등 다양한 프로세서를 제공합니다.
로그 2차 파서는 1차 파싱 결과에 특정 목적의 2차 파싱을 적용합니다. 2차 파서를 사용하려면 1차 파서가 등록되어 있어야 합니다.
파서 목록

등록한 파서를 조회하고, 추가 및 편집할 수 있습니다.
파서 추가, 순서 변경, 활성화 토글, 수정 및 삭제 등의 조작 방법은 1차 파서 목록과 동일합니다.
파서 등록 순서
다음은 파서를 등록하는 공통 순서입니다.

4xx, 5xx 상태 코드 파서 설정 항목
4xx, 5xx 상태 코드 파서는 1차 파서로 파싱된 status 값을 기반으로 4xx, 5xx 건수 데이터를 생성합니다. 특정 상태 코드를 제외하려면 제외할 상태 코드를 입력하세요.
설정 항목
| 설정 값 | 설명 | 기타 |
|---|---|---|
| 카테고리 | 4xx, 5xx건수 데이터를 생성할 카테고리입니다. | required |
| 로그 검출 조건 | 필터로 적용할 검색 키, 검색 값을 입력합니다. 로그 검출 조건에 맞는 로그 데이터에 대해서만 4xx, 5xx건수 데이터를 생성합니다. 로그 검출 조건을 입력하지 않으면 모든 로그를 대상으로 데이터를 생성합니다. | optional |
| 제외할 상태 코드 | 통계 데이터 생성 시 제외할 상태 코드입니다. 입력하지 않으면 4xx~5xx에 해당하는 전체 오류 상태 코드를 대상으로 4xx, 5xx건수 데이터를 생성합니다. | optional |
status 파서 등록 예시

유입되는 로그가 {"msg":"message","status":404}이고 예시처럼 GROK 파서로 status를 파싱한다면, status: 404와 같이 파싱됩니다. status가 정상적으로 파싱되는 것을 확인했다면 4XX,5XX 상태 코드 파서에서 제외할 상태 코드를 등록하세요.
데이터 조회
파서를 모두 등록하면 통합 Flex 보드로 이동해 로그 4XX, 5XX 건수 위젯을 생성하세요.

위젯을 생성하면 다음과 같이 데이터를 확인할 수 있습니다.

-
avg: 조회 기간 데이터 평균값입니다.
-
max: 조회 기간 데이터 중 최댓값입니다.
-
recently: 조회 기간 데이터 중 마지막 값입니다.
상태 코드 성공률 파서 설정 항목
상태 코드 성공률 파서는 1차 파서로 파싱된 status 값을 기반으로 HTTP 요청 성공률 데이터를 생성합니다. 특정 상태 코드를 제외하려면 제외할 상태 코드를 입력하세요. status 파싱에 관한 내용은 4xx, 5xx 상태 코드 파서 설정 항목을 참조하세요.
설정 항목
| 설정 값 | 설명 | 기타 |
|---|---|---|
| 카테고리 | 요청 성공률 데이터를 생성할 카테고리입니다. | required |
| 로그 검출 조건 | 필터로 적용할 검색 키, 검색 값을 입력합니다. 로그 검출 조건에 맞는 로그 데이터에 대해서만 요청 성공률 데이터를 생성합니다. 로그 검출 조건을 입력하지 않으면 모든 로그를 대상으로 데이터를 생성합니다. | optional |
| 제외할 상태 코드 | 요청 성공률 데이터 생성 시 제외할 상태 코드입니다. 입력하지 않으면 2xx~3xx에 해당하는 전체 성공 상태 코드를 대상으로 요청 성공률 데이터를 생성합니다. | optional |
데이터 조회
파서를 모두 등록하면 통합 Flex 보드로 이동해 로그 요청 성공률 위젯을 생성하세요.

위젯을 생성하면 다음과 같이 데이터를 확인할 수 있습니다.

차트 위 데이터는 조회 기간에 대한 통계를 나타냅니다. 통계 방법을 최근값, 최댓값, 평균값 등으로 선택할 수 있습니다. 최근값이 기본 으로 선택되어 있습니다.
2차 파서 프로세서
로그 2차 파서는 4xx, 5xx 상태 코드 파서와 상태 코드 성공률 파서 외에도 다음과 같은 필드 가공 프로세서를 제공합니다.

| 프로세서 | 설명 |
|---|---|
| 모든 키워드 포함 필터 | 지정한 모든 키워드가 포함된 로그에 플래그 필드를 추가합니다. |
| 일부 키워드 포함 필터 | 지정한 키워드 중 하나라도 포함된 로그에 플래그 필드를 추가합니다. |
| 필드명 변경 | 기존 필드명을 다른 이름으로 변경합니다. |
| 상태 코드 그룹 분류 | HTTP 상태 코드를 2xx/3xx/4xx/5xx 그룹으로 자동 분류합니다. |
| URL 정적/동적 분류 | URL에 확장자(.)가 있으면 정적 콘텐츠, 없으면 동적 서블릿으로 분류합니다. |
| URL 파라미터 제거 | URL에서 ? 이후의 쿼리 파라미터를 제거한 값을 저장합니다. |
| 응답 시간 분류 | 응답 시간(ms)을 fast/normal/slow/critical 구간으로 자동 분류합니다. |
| JSON 필드 추출 | JSON 문자열 필드에서 특정 키를 추출하여 새 필드로 저장합니다. |
| GeoIP 변환 | IP 주소를 국가/도시 정보로 변환합니다. |
| 직접 입력 | FQN 클래스명으로 프로세서를 직접 등록합니다. |
모든 키워드 포함 필터
지정한 모든 키워드가 포함된 로그에 플래그 필드를 추가합니다.
| 설정 값 | 설명 | 기본값 |
|---|---|---|
| 입력 필드 | 키워드를 검색할 필드명 | content |
| 저장 필드 | 결과를 저장할 필드명 | has_str_all |
| keyword | 검색할 키워드 목록 (쉼표로 구분해 입력) | required |
활용 예시
입력 필드를 content, 키워드를 error, timeout, database로 설정하면 세 키워드가 모두 포함된 로그에만 has_str_all 필드가 추가됩니다.
일부 키워드 포함 필터
지정한 키워드 중 하나라도 포함된 로그에 플래그 필드를 추가합니다.
| 설정 값 | 설명 | 기본값 |
|---|---|---|
| 입력 필드 | 키워드를 검색할 필드명 | content |
| 저장 필드 | 결과를 저장할 필드명 | has_str_any |
| keyword | 검색할 키워드 목록 (쉼표로 구분해 입력) | required |
활용 예시
입력 필드를 content, 키워드를 reboot, shutdown, restart로 설정하면 키워드 중 하나라도 포함된 로그에 has_str_any 필드가 추가됩니다.
필드명 변경
기존 필드명을 다른 이름으로 변경합니다. 대상 필드명이 이미 존재하면 덮어쓰지 않습니다.
| 설정 값 | 설명 | 기본값 |
|---|---|---|
| 원본 필드 | 변경할 기존 필드명 | required |
| 새 필드명 | 변경 후 필드명 | required |
상태 코드 그룹 분류
HTTP 상태 코드를 status_2xx, status_3xx, status_4xx, status_5xx 그룹으로 자동 분류합니다.
| 설정 값 | 설명 | 기본값 |
|---|---|---|
| 입력 필드 | 상태 코드가 담긴 필드명 | status |
| 저장 필드 | 그룹 분류 결과를 저장할 필드명 | status_nxx |
활용 예시
status 값이 404이면 status_nxx 필드에 status_4xx가 저 장됩니다.
URL 정적/동적 분류
URL에 확장자(.)가 포함되어 있으면 정적 콘텐츠, 포함되지 않으면 동적 서블릿으로 분류합니다.
| 설정 값 | 설명 | 기본값 |
|---|---|---|
| 입력 필드 | URL이 담긴 필드명 | url |
| 저장 필드 | 분류 결과를 저장할 필드명 | url_type |
URL 파라미터 제거
URL에서 ? 이후의 쿼리 파라미터를 제거한 경로만 저장합니다.
| 설정 값 | 설명 | 기본값 |
|---|---|---|
| 입력 필드 | URL이 담긴 필드명 | url |
| 저장 필드 | 파라미터 제거 결과를 저장할 필드명 | url_without_params |
활용 예시
/api/v1/users?page=1&size=20 → url_without_params 필드에 /api/v1/users가 저장됩니다.
응답 시간 분류
응답 시간(ms)을 구간별로 자동 분류합니다. 구간 임계값을 직접 설정할 수 있습니다.
| 설정 값 | 설명 | 기본값 |
|---|---|---|
| 입력 필드 | 응답 시간(ms)이 담긴 필드명 | elapsed |
| 저장 필드 | 분류 결과를 저장할 필드명 | response_class |
| Fast 상한(ms) | fast 구간 상한값 | 100 |
| Normal 상한(ms) | normal 구간 상한값 | 500 |
| Slow 상한(ms) | slow 구간 상한값 | 2000 |
기본값 기준 분류 결과는 다음과 같습니다.
| 응답 시간 | 분류 |
|---|---|
| 0 ~ 100ms | fast |
| 101 ~ 500ms | normal |
| 501 ~ 2000ms | slow |
| 2001ms 이상 | critical |
활용 예시
로그 탐색에서 response_class: critical로 필터링하면 응답 시간이 2초를 초과하는 로그만 조회할 수 있습니다.
JSON 필드 추출
1차 파서로 추출한 필드에 JSON 문자열이 포함된 경우 해당 JSON에서 특정 키를 추출하여 새 필드로 저장합니다.
| 설정 값 | 설명 | 기본값 |
|---|---|---|
| 입력 필드 | JSON 문자열이 담긴 필드명 | payload |
| 추출할 키 | 추출할 JSON 키 목록 (쉼표로 구분해 입력) | required |
| 저장 접두사 | 추출된 키 이름 앞에 붙일 접두사 (예를 들어 json_) | optional |
-
로그 전체가 JSON인 경우 1차 JSON 파서가 자동으로 파싱합니다. 이 프로세서는 GROK 1차 파서 사용 시 텍스트 로그 안에 포함된 JSON 부분을 추가로 파싱할 때 유용합니다.
-
성능 보호를 위해 JSON 필드 크기가 10KB를 초과하면 파싱을 건너뜁니다.
활용 예시
payload = {"user":"alice","action":"purchase","product":"laptop","amount":45000}
입력 필드 payload, 추출할 키 user, action, 저장 접두사 pay_ 설정 시 다음과 같이 추출됩니다.
pay_user = alice
pay_action = purchase
GeoIP 변환
IP 주소를 국가 및 도시 정보로 변환합니다. IP2Location 데이터베이스를 활용해 접근 로그의 지역별 분석이 가능합니다.
| 설정 값 | 설명 | 기본값 |
|---|---|---|
| 입력 필드 | IP 주소가 담긴 필드명 | client_ip |
| 저장 접두사 | 결과 필드 이름의 접두사 | geo |
결과로 {접두사}_country, {접두사}_city 두 개의 필드가 생성됩니다.
활용 예시
입력 필드 client_ip 값이 223.130.195.200이고 저장 접두사가 geo이면 다음과 같이 변환됩니다.
geo_country = KR
geo_city = Seongnam
직접 입력
목록에 없는 프로세서를 FQN(Fully Qualified Name) 클래스명으로 직접 등록할 수 있습니다.
io.whatap.logsink.processor.ClassName{"param1":"value1","param2":"value2"}
클래스명과 파라미터 형식이 정확해야 합니다. 잘못된 입력 시 프로세서가 동작하지 않을 수 있습니다.
2차 파서 체이닝
동일 카테고리에 여러 2차 파서를 등록해 체이닝할 수 있습니다. 각 프로세서는 등록 순서대로 실행됩니다.
2026-04-23T10:30:00.123+0900|INFO|api-01|192.168.1.10|/api/v1/orders?detail=true|200|1234|{"user":"alice","action":"purchase"}|Request processed
| 순서 | 파서 | 입력 → 출력 |
|---|---|---|
| 1차 | GROK | timestamp, level, host, client_ip, url, status, elapsed, payload, content |
| 2차-1 | JSON 필드 추출 | payload → user, action |
| 2차-2 | 응답 시간 분류 | elapsed → response_class (slow) |
| 2차-3 | 상태 코드 그룹 분류 | status → status_nxx (status_2xx) |
| 2차-4 | URL 파라미터 제거 | url → url_without_params (/api/v1/orders) |
| 2차-5 | GeoIP 변환 | client_ip → geo_country (KR), geo_city (Seoul) |
2차 파서의 카테고리는 1차 파서와 동일하게 설정해야 합니다. 다른 카테고리로 설정하면 해당 로그에 2차 파서가 적용되지 않습니다.
로그 파서를 사용하면 불규칙한 형태의 로그를 쿼리가 가능한 구조화된 형태로 변경할 수 있습니다. 와탭 로그 모니터링은 다음과 같이 두 가지 유형의 파서를 제공합니다.
-
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+\bSPACE \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 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}?
- 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 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=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 -
시뮬레이션 성공 시 시뮬레이션 결과 및 퍼포먼스 측정 결과를 조회할 수 있습니다.
-
시뮬레이션 후 패턴 적용 버튼 클릭 시 선택한 파서에 입력한 패턴이 적용됩니다.
-
패턴 적용 후 카테고리 및 로그 검출 조건, 패턴을 입력하세요.

-
카테고리
로그 카테고리를 선택하세요. 카테고리는 필수로 입력해야 합니다.
-
로그 검출 조건
-
조건에 만족하는 로그만 파서가 적용됩니다.
-
검색 키와 검색 값을 선택하거나 직접 입력하세요.
-
로그 검출 조건
-
-
카테고리