추출 (Extractions)
📣 Calculated Fields Extractions는 Preview 단계예요.
Log Explorer에서 Grok 또는 regex 패턴으로 쿼리 시점에 로그에서 값을 추출하려면 Calculated Fields Extractions를 사용해요. 액세스 요청하기
출처: 문서
본문
개요
Calculated Fields Extractions를 사용하면 Log Explorer에서 쿼리 시점에 파싱 규칙을 적용할 수 있어요. 파이프라인을 수정하거나 데이터를 다시 수집하지 않고도 원시 로그 메시지나 속성에서 값을 추출할 수 있죠. Tap to Parse로 추출 규칙을 자동 생성하거나, 특정 요구에 맞는 Grok 또는 regex 패턴을 직접 정의할 수도 있어요. 추출 패턴은 Grok 표현식 또는 명명된 캡처 그룹이 있는 정규식(regex)으로 작성할 수 있어요.
추출은 수식보다 먼저 실행되므로, 계산 필드 수식이 추출이 만든 필드를 참조할 수 있어요. 반대는 불가능해요. 계산 필드에서 추출할 수는 없어요.
추출 계산 필드를 만들려면 계산 필드 만들기를 참고해요.
Tap to Parse
Tap to Parse로 로그 데이터에서 추출 규칙을 자동 생성해요. Datadog가 로그 메시지를 분석해 Grok 규칙이나 regex 패턴을 만들어요.
로그 사이드 패널에서 Tap to Parse에 접근하는 방법은 두 가지예요:
- 복사 버튼 옆의 Tap을 클릭해요.
- 로그 메시지의 특정 부분을 강조하고 팝업 메뉴에서 Tap을 클릭해요.
Tap을 클릭하면 Datadog가 Calculated Field 폼을 자동으로 채워요:
- Extract from: 기본값은 전체 로그 메시지예요. 드롭다운을 바꿔 개별 속성을 파싱할 수도 있어요.
- Log sample: 선택한 로그로 자동 채워져요.
- Parsing rule: 로그 샘플에서 자동 생성돼요.
생성된 규칙을 필요한 대로 검토·수정해요. 직접 편집하거나 Generate a new rule을 클릭해 Datadog가 다시 시도하게 할 수 있어요. 로그 샘플을 수정·삽입·교체해 다른 로그 형식에 대해 규칙을 테스트할 수도 있어요. 엄지 위/아래 버튼으로 인라인 피드백을 제공해 기능 개선에 도움을 줄 수 있어요.
패턴 유형
추출 패턴을 Grok 또는 regex로 작성해요.
Grok
추출 필드는 Grok 패턴으로 로그 속성에서 값을 식별·캡처해요. Grok 패턴은 다음 형식의 하나 이상의 토큰으로 구성돼요:
%{PATTERN_NAME:field_name}
PATTERN_NAME: Grok 매처(matcher)field_name: 추출된 계산 필드의 이름
여러 패턴을 연결해 복잡한 로그 메시지를 파싱할 수 있어요.
⚠️ Log Explorer의 쿼리 시점 Grok 파싱은 제한된 기능 집합을 지원해요. data, integer, notSpace, number, word 매처와 number, integer 필터를 지원해요. 장기 파싱이 필요하면 로그 파이프라인을 정의해요.
Log Explorer의 쿼리 시점 Grok 파싱은 제한된 매처·필터 하위 집합을 지원해요. 각 매처나 필터는 다음 형식으로 Grok 패턴에 사용돼요:
%{MATCHER:field_name}
매처 (Matchers)
| 매처 | Grok 패턴 예시 |
|---|---|
data모든 문자 시퀀스 (비탐욕적) |
status=%{data:status} |
word영숫자 문자 |
country=%{word:country} |
number부동소수점 수 |
value=%{number:float_val} |
integer정수 값 |
count=%{integer:count} |
notSpace공백이 아닌 문자 |
path=%{notSpace:request_path} |
필터 (Filters)
추출된 값을 숫자 유형으로 변환하려면 필터를 적용해요. 필터는 매처와 같은 패턴 구문을 사용해요.
| 필터 | Grok 패턴 예시 |
|---|---|
number숫자 문자열을 숫자로 파싱 |
latency=%{number:lat} |
integer숫자 문자열을 정수로 파싱 |
users=%{integer:user_count} |
예시
로그 줄:
country=Brazil duration=123ms path=/index.html status=200 OK
추출 grok 규칙:
country=%{word:country} duration=%{integer:duration} path=%{notSpace:request_path} status=%{data:status}
결과 계산 필드:
#country = Brazil#duration = 123#request_path = /index.html#status = 200 OK
Regex
추출된 값은 항상 문자열이에요. %{integer:status} 같은 Grok 규칙과 달리 regex 추출은 타입을 변환하지 않아요. 추출된 값을 숫자로 사용하려면 산술 수식에서 참조해요.
지원 구문 (Supported syntax)
| 기능 | 예시 | 설명 |
|---|---|---|
| 리터럴 텍스트 | error |
리터럴 문자 |
| 모든 문자 | . |
개행을 제외한 모든 문자 |
| 문자 클래스 | [a-z0-9], [^abc] |
세트 안의 임의 문자 하나, 또는 세트에 없는 임의 문자 하나 |
| 약식 클래스 | \d, \w, \s, \D, \W, \S |
숫자, 단어 문자, 공백 문자, 그리고 그 부정 |
| 유니코드 속성 클래스 | \p{L}+ |
유니코드 속성별 문자(예: 모든 문자) |
| 선택 (Alternation) | `error | timeout` |
| 그룹 (Groups) | `(error | timeout), (?:error |
| 명명된 캡처 그룹 | (?<status>\d+) |
이름 아래에 일치 항목을 캡처. 추출에 필수 |
| 수량자 (Quantifiers) | a*, a+, a?, a{2,4} |
반복. *는 0개 이상, +는 1개 이상, ?는 선택 사항, {m,n}은 범위를 설정. 가능한 한 많이 일치 |
| 느슨한 수량자 | .*?end |
동일한 반복이지만 가능한 한 적게 일치 |
| 앵커 (Anchors) | ^ERROR, timeout$ |
기본적으로 전체 값의 시작 또는 끝 |
| 단어 경계 | \berror\b |
단어와 비단어 문자 사이의 위치. 그래서 error는 일치하지만 errors는 일치하지 않음 |
| 문자 이스케이프 | \n, \r, \t |
개행, 캐리지 리턴, 탭 |
| 메타문자 이스케이프 | \., \*, \( |
특별한 의미가 아니라 문자 자체 |
여기에 나열된 구조만 지원돼요. 다른 구조를 사용한 패턴은 실행될 수 있지만 동작이 보장되지는 않아요.
값은 스택 트레이스처럼 여러 줄을 포함할 수 있어요. .로 개행을 일치시키려면 패턴 시작에 (?s)를 추가해요. 각 줄의 시작과 끝에서 ^와 $를 일치시키려면 패턴 시작에 (?m)을 추가해요.
표시된 것처럼 패턴을 단일 백슬래시로 작성해요. 수식 regex 함수에서는 패턴이 따옴표로 묶인 문자열 인자이고 각 백슬래시를 두 배로 해야 해요.
캡처 그룹 규칙
패턴은 다음 규칙을 따라야 해요:
- 최소 하나의 캡처 그룹을 포함해야 해요.
- 모든 캡처 그룹에 이름이 있어야 해요.
(…)가 아니라(?<name>…)를 사용해요.- 필드를 만들지 않고 그룹화하려면
(?:…)를 사용해요.
- 각 이름은 고유해야 해요. 이름이 추출된 필드의 이름이 돼요.
- 각 이름은 문자로 시작하고 문자와 숫자만 포함해야 해요(
[A-Za-z][A-Za-z0-9]*).client_ip,http.status,client-ip같은 이름은 유효한 캡처 그룹 이름이 아니에요.
예시
로그 줄:
10.0.0.14 GET /api/v1/orders 503
Regex 패턴:
(?<ip>\S+) (?<method>\S+) /api/(?:v\d+)/(?<resource>\S+) (?<status>\d+)
이 패턴은 캡처 그룹 규칙을 따르고 있어요:
- 네 그룹에 이름이 있어요:
ip,method,resource,status - 각 이름이 고유해요.
- 각 이름이 문자와 숫자만 사용해요.
(?:v\d+)그룹은 이름이 없어요. 버전 세그먼트를 그룹화하지만 필드를 만들지 않아요.
결과 계산 필드:
#ip = 10.0.0.14#method = GET#resource = orders#status = 503
추출된 필드로 필터링, 그룹화, 정렬할 수 있어요. 패턴이 일치하지 않는 로그는 그 필드에 값이 없어요.
잘못된 패턴 (Invalid patterns)
아래 각 패턴은 하나의 캡처 그룹 규칙을 위반해요.
| 패턴 | 문제 |
|---|---|
(?:\S+) (?:\S+) (?:\S+) (?:\S+) |
명명된 그룹 없음. 패턴에는 최소 하나가 필요해요. |
(?<ip>\S+) (?<ip>\S+) |
ip 이름이 두 번 사용됨. 각 이름은 고유해야 해요. |
(?<client_ip>\S+) |
이름에 밑줄이 있음. 이름은 문자와 숫자만 가질 수 있어요. |
(?<1status>\d+) |
이름이 숫자로 시작함. 이름은 문자로 시작해야 해요. |
패턴 성능
Datadog는 일치가 시작되어야 하는 위치를 알 수 있을 때 패턴을 가장 빠르게 일치시켜요. ^ 또는 리터럴 텍스트로 시작하는 패턴은 그 시작점을 제공해요. .*로 시작하는 패턴은 그렇지 않아서 값의 모든 위치에서 시도돼요.
짧은 값에서는 차이가 무시할 만해요. 스택 트레이스 같은 큰 값에서는 앵커되지 않은 패턴이 쿼리를 느리게 할 수 있어요. 일치 없음 대신 오류로 쿼리를 실패시킬 수도 있어요. 값에 예측 가능한 시작점이 있으면 ^로 패턴을 앵커하고, 양쪽에 .*로 리터럴을 감싸는 것을 피해요.