구성 가능한 구문 분석기 유형 프로세서 - Amazon CloudWatch Logs

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

구성 가능한 구문 분석기 유형 프로세서

이 섹션에는 로그 이벤트 변환기에서 사용할 수 있는 구성 가능한 데이터 구문 분석기 프로세서에 대한 정보가 포함되어 있습니다.

parseJSON

parseJSON 프로세서는 JSON 로그 이벤트를 구문 분석하며, 추출된 JSON 키-값 쌍을 대상 아래에 삽입합니다. 대상을 지정하지 않으면 프로세서가 루트 노드 아래에 키-값 쌍을 배치합니다. parseJSON을 첫 번째 프로세서로 사용할 때는 @message를 소스 필드로 사용하여 전체 로그 이벤트를 구문 분석해야 합니다. 초기 JSON 구문 분석 후 후속 프로세서에서 특정 필드를 조작할 수 있습니다.

원래 @message 내용은 변경되지 않으며 새 키가 메시지에 추가됩니다.

필드 설명 필수 기본값 제한 사항

source

구문 분석할 로그 이벤트의 필드 경로. 점 표기법을 사용하여 하위 필드에 액세스합니다. 예: store.book

아니요

@message

최대 길이: 128

최대 중첩 키 깊이: 3

대상

구문 분석된 JSON의 대상 필드

아니요

Parent JSON node

최대 길이: 128

최대 중첩 키 깊이: 3

예제

수집된 로그 이벤트가 다음과 같다고 가정해 보겠습니다.

{ "outer_key": { "inner_key": "inner_value" } }

parseJSON 프로세서가 있는 경우:

[ { "parseJSON": { "destination": "new_key" } } ]

변환된 로그 이벤트는 다음과 같습니다.

{ "new_key": { "outer_key": { "inner_key": "inner_value" } } }

grok

grok 프로세서를 사용하여 패턴 매칭을 사용하여 비정형 데이터를 구문 분석하고 구조화합니다. 이 프로세서는 로그 메시지에서 필드를 추출할 수도 있습니다.

필드 설명 필수 기본값 제한 사항 참고 사항

source

Grok 매칭을 적용할 필드의 경로

아니요

@message

최대 길이: 128

최대 중첩 키 깊이: 3

match

로그 이벤트와 매칭할 grok 패턴

최대 길이: 512

최대 grok 패턴: 20

일부 grok 패턴 유형에는 개별 사용량 제한이 있습니다. {URI, URIPARAM, URIPATHPARAM, SPACE, DATA, GREEDYDATA, GREEDYDATA_MULTILINE} 패턴의 조합은 최대 5회까지 사용할 수 있습니다.

Grok 패턴은 유형 변환을 지원하지 않습니다.

일반적인 로그 형식 패턴(APACHE_ACCESS_LOG, NGINX_ACCESS_LOG, SYSLOG5424)의 경우 일반적인 로그 패턴 뒤에는 DATA, GREEDYDATA 또는 GREEDYDATA_MULTILINE 패턴만 포함될 수 있습니다.

지원되는 모든 Grok 패턴 보기

Grok 패턴의 구조

지원되는 grok 패턴 구조는 다음과 같습니다.

%{PATTERN_NAME:FIELD_NAME}
  • PATTERN_NAME: 특정 유형의 데이터와 일치시키기 위해 미리 정의된 정규식을 나타냅니다. 사전 정의된 grok 패턴만 지원됩니다. 사용자 지정 패턴 생성은 허용되지 않습니다.

  • FIELD_NAME: 추출된 값에 이름을 할당합니다. FIELD_NAME은 선택 사항이지만 이 값을 지정하지 않으면 추출된 데이터가 변환된 로그 이벤트에서 삭제됩니다. FIELD_NAME은 점 표기법(예: 'parent.child')을 사용하는 경우 JSON 경로로 간주됩니다.

  • 유형 변환: 명시적 유형 변환은 지원되지 않습니다. TypeConverter 프로세서를 사용하여 grok에서 추출한 값의 데이터타입을 변환합니다.

보다 복잡한 매칭 표현식을 생성하려면 여러 grok 패턴을 결합하면 됩니다. 로그 이벤트를 매칭하도록 최대 20개의 grok 패턴을 결합할 수 있습니다. 예를 들어, 이 %{NUMBER:timestamp} [%{NUMBER:db} %{IP:client_ip}:%{NUMBER:client_port}] %{GREEDYDATA:data} 패턴 조합을 사용하여 다음과 같은 Redis 슬로우 로그 항목에서 필드를 추출할 수 있습니다.

1629860738.123456 [0 127.0.0.1:6379] "SET" "key1" "value1"

Grok 예제

예제 1: grok를 사용하여 비정형 로그에서 필드 추출

샘플 로그:

293750 server-01.internal-network.local OK "[Thread-000] token generated"

사용된 변환기:

[ { "grok": { "match": "%{NUMBER:version} %{HOSTNAME:hostname} %{NOTSPACE:status} %{QUOTEDSTRING:logMsg}" } } ]

출력:

{ "version": "293750", "hostname": "server-01.internal-network.local", "status": "OK", "logMsg": "[Thread-000] token generated" }

샘플 로그:

23/Nov/2024:10:25:15 -0900 172.16.0.1 200

사용된 변환기:

[ { "grok": { "match": "%{HTTPDATE:timestamp} %{IPORHOST:clientip} %{NUMBER:response_status}" } } ]

출력:

{ "timestamp": "23/Nov/2024:10:25:15 -0900", "clientip": "172.16.0.1", "response_status": "200" }

예제 2: parseJSON과 함께 grok를 사용하여 JSON 로그 이벤트에서 필드 추출

샘플 로그:

{ "timestamp": "2024-11-23T16:03:12Z", "level": "ERROR", "logMsg": "GET /page.html HTTP/1.1" }

사용된 변환기:

[ { "parseJSON": {} }, { "grok": { "source": "logMsg", "match": "%{WORD:http_method} %{NOTSPACE:request} HTTP/%{NUMBER:http_version}" } } ]

출력:

{ "timestamp": "2024-11-23T16:03:12Z", "level": "ERROR", "logMsg": "GET /page.html HTTP/1.1", "http_method": "GET", "request": "/page.html", "http_version": "1.1" }

예제 3: FIELD_NAME에 점 주석이 있는 Grok 패턴

샘플 로그:

192.168.1.1 GET /index.html?param=value 200 1234

사용된 변환기:

[ { "grok": { "match": "%{IP:client.ip} %{WORD:method} %{URIPATHPARAM:request.uri} %{NUMBER:response.status} %{NUMBER:response.bytes}" } } ]

출력:

{ "client": { "ip": "192.168.1.1" }, "method": "GET", "request": { "uri": "/index.html?param=value" }, "response": { "status": "200", "bytes": "1234" } }

지원되는 grok 패턴

다음 표에는 grok 프로세서에서 지원하는 패턴이 나열되어 있습니다.

일반 grok 패턴

Grok 패턴 설명 최대 패턴 제한 예제
사용자 이름 또는 사용자 소문자(a~z), 대문자(A~Z), 숫자(0~9), 점(.), 밑줄(_) 또는 하이픈(-)을 포함할 수 있는 하나 이상의 문자와 일치합니다. 20

입력: user123.name-TEST

패턴: %{USERNAME:name}

출력: {"name": "user123.name-TEST"}

INT 선택 사항인 더하기 또는 빼기 기호 뒤에 하나 이상의 숫자가 오는 것과 일치합니다. 20

입력: -456

패턴: %{INT:num}

출력: {"num": "-456"}

BASE10NUM 부호 및 소수점 옵션이 있는 정수 또는 부동 소수점 숫자와 일치합니다. 20

입력: -0.67

패턴: %{BASE10NUM:num}

출력: {"num": "-0.67"}

BASE16NUM 10진수 및 16진수와 선택적 기호(+ 또는 -) 및 선택적 0x 접두사와 일치합니다. 20

입력: +0xA1B2

패턴: %{BASE16NUM:num}

출력: {"num": "+0xA1B2"}

POSINT 하나 이상의 숫자(1~9 다음에 0~9)로 구성된 앞에 0이 없는 정수와 일치합니다. 20

입력: 123

패턴: %{POSINT:num}

출력: {"num": "123"}

NONNEGINT 0과 앞에 0이 있는 숫자를 포함하여 모든 정수(0~9의 숫자로 구성)와 일치합니다. 20

입력: 007

패턴: %{NONNEGINT:num}

출력: {"num": "007"}

WORD 문자, 숫자 및 밑줄을 포함하여 하나 이상의 단어 문자(\w)로 구성된 전체 단어와 일치합니다.. 20

입력: user_123

패턴: %{WORD:user}

출력: {"user": "user_123"}

NOTSPACE 공백이 없는 하나 이상의 문자와 일치합니다. 5

입력: hello_world123

패턴: %{NOTSPACE:msg}

출력: {"msg": "hello_world123"}

SPACE 0개 이상의 공백 문자와 일치합니다. 5

입력: " "

패턴: %{SPACE:extra}

출력: {"extra": " "}

DATA 모든 문자(줄 바꿈 제외)와 0회 이상 최소 일치합니다. 5

입력: abc def ghi

패턴: %{DATA:x} %{DATA:y}

출력: {"x": "abc", "y": "def ghi"}

GREEDYDATA 모든 문자(줄 바꿈 제외)와 0회 이상 최대 일치합니다. 5

입력: abc def ghi

패턴: %{GREEDYDATA:x} %{GREEDYDATA:y}

출력: {"x": "abc def", "y": "ghi"}

GREEDYDATA_MULTILINE 모든 문자(줄 바꿈 포함)와 0회 이상 최대 일치합니다. 1

입력:

abc

def

ghi

패턴: %{GREEDYDATA_MULTILINE:data}

출력: {"data": "abc\ndef\nghi"}

QUOTEDSTRING 이스케이프 처리된 문자가 포함된 따옴표(작은따옴표 또는 큰따옴표)로 묶인 문자열과 일치합니다. 20

입력: "Hello, world!"

패턴: %{QUOTEDSTRING:msg}

출력: {"msg": "Hello, world!"}

UUID 표준 UUID 형식과 일치합니다. 즉, 8개의 16진수 문자 뒤에 4개의 16진수 문자로 구성된 3개의 그룹이 오고 12개의 16진수 문자로 끝나며, 모두 하이픈으로 구분됩니다. 20

입력: 550e8400-e29b-41d4-a716-446655440000

패턴: %{UUID:id}

출력: {"id": "550e8400-e29b-41d4-a716-446655440000"}

urn URN(Uniform Resource Name) 구문과 일치합니다. 20

입력: urn:isbn:0451450523

패턴: %{URN:urn}

출력: {"urn": "urn:isbn:0451450523"}

AWS grok 패턴

패턴 설명 최대 패턴 제한 예제

ARN

파티션(aws, 또는 aws-us-gov), 서비스aws-cn, 리전, 계정 ID 및 슬래시로 구분된 최대 5개의 계층적 리소스 식별자를 캡처하여 AWS Amazon 리소스 이름(ARNs)과 일치합니다. 콜론 간에 누락된 정보가 있는 ARN을 매칭하지 않습니다.

5

입력: arn:aws:iam:us-east-1:123456789012:user/johndoe

패턴: %{ARN:arn}

출력: {"arn": "arn:aws:iam:us-east-1:123456789012:user/johndoe"}

네트워킹 grok 패턴

Grok 패턴 설명 최대 패턴 제한 예제
CISCOMAC 4-4-4 16진수 형식의 MAC 주소와 일치합니다. 20

입력: 0123.4567.89AB

패턴: %{CISCOMAC:MacAddress}

출력: {"MacAddress": "0123.4567.89AB"}

WINDOWSMAC 하이픈이 포함된 16진수 형식의 MAC 주소와 일치합니다. 20

입력: 01-23-45-67-89-AB

패턴: %{WINDOWSMAC:MacAddress}

출력: {"MacAddress": "01-23-45-67-89-AB"}

COMMONMAC 콜론이 포함된 16진수 형식의 MAC 주소와 일치합니다. 20

입력: 01:23:45:67:89:AB

패턴: %{COMMONMAC:MacAddress}

출력: {"MacAddress": "01:23:45:67:89:AB"}

MAC CISCOMAC, WINDOWSMAC 또는 COMMONMAC grok 패턴 중 하나와 일치합니다. 20

입력: 01:23:45:67:89:AB

패턴: %{MAC:m1}

출력: {"m1":"01:23:45:67:89:AB"}

IPV6 압축된 양식 및 IPv4 매핑된 IPv6 주소를 포함한 IPv6 주소와 일치합니다. 5

입력: 2001:db8:3333:4444:5555:6666:7777:8888

패턴: %{IPV6:ip}

출력: {"ip": "2001:db8:3333:4444:5555:6666:7777:8888"}

IPV4 IPv4 주소와 일치합니다. 20

입력: 192.168.0.1

패턴: %{IPV4:ip}

출력: {"ip": "192.168.0.1"}

IP %{IPv6}에서 지원하는 IPv6 주소 또는 %{IPv4}에서 지원하는 IPv4 주소 중 하나와 일치합니다. 5

입력: 192.168.0.1

패턴: %{IP:ip}

출력: {"ip": "192.168.0.1"}

HOSTNAME 또는 HOST 하위 도메인을 포함한 도메인 이름과 일치합니다. 5

입력: server-01.internal-network.local

패턴: %{HOST:host}

출력: {"host": "server-01.internal-network.local"}

IPORHOST 호스트 이름 또는 IP 주소와 일치합니다. 5

입력: 2001:db8:3333:4444:5555:6666:7777:8888

패턴: %{IPORHOST:ip}

출력: {"ip": "2001:db8:3333:4444:5555:6666:7777:8888"}

HOSTPORT %{IPORHOST} 패턴에서 지원하는 IP 주소 또는 호스트 이름과 일치하고, 그 뒤에 콜론과 포트 번호가 오며, 출력에서 포트를 'PORT'로 캡처합니다. 5

입력: 192.168.1.1:8080

패턴: %{HOSTPORT:ip}

출력: {"ip":"192.168.1.1:8080","PORT":"8080"}

URIHOST %{IPORHOST} 패턴에서 지원하는 IP 주소 또는 호스트 이름과 일치하고, 선택적으로 그 뒤에 콜론과 포트 번호가 오고, 포트가 있는 경우 'port'로 캡처합니다. 5

입력: example.com:443 10.0.0.1

패턴: %{URIHOST:host} %{URIHOST:ip}

출력: {"host":"example.com:443","port":"443","ip":"10.0.0.1"}

경로 grok 패턴

Grok 패턴 설명 최대 패턴 제한 예제
UNIXPATH 쿼리 파라미터를 포함할 수 있는 URL 경로와 일치합니다. 20

입력: /search?q=regex

패턴: %{UNIXPATH:path}

출력: {"path":"/search?q=regex"}

WINPATH Windows 파일 경로와 일치합니다. 5

입력: C:\Users\John\Documents\file.txt

패턴: %{WINPATH:path}

출력: {"path": "C:\\Users\\John\\Documents\\file.txt"}

PATH URL 또는 Windows 파일 경로와 일치합니다. 5

입력: /search?q=regex

패턴: %{PATH:path}

출력: {"path":"/search?q=regex"}

TTY 터미널 및 가상 터미널의 Unix 디바이스 경로와 일치합니다. 20

입력: /dev/tty1

패턴: %{TTY:path}

출력: {"path":"/dev/tty1"}

URIPROTO 문자와 일치하며, 선택적으로 그 뒤에 더하기(+) 문자와 추가 문자 또는 더하기(+) 문자가 옵니다. 20

입력: web+transformer

패턴: %{URIPROTO:protocol}

출력: {"protocol":"web+transformer"}

URIPATH URI의 경로 구성 요소와 일치합니다. 20

입력: /category/sub-category/product_name

패턴: %{URIPATH:path}

출력: {"path":"/category/sub-category/product_name"}

URIPARAM URL 쿼리 파라미터와 일치합니다. 5

입력: ?param1=value1&param2=value2

패턴: %{URIPARAM:url}

출력: {"url":"?param1=value1&param2=value2"}

URIPATHPARAM URI 경로와 일치하며, 선택적으로 그 뒤에 쿼리 파라미터가 옵니다. 5

입력: /category/sub-category/product?id=12345&color=red

패턴: %{URIPATHPARAM:path}

출력: {"path":"/category/sub-category/product?id=12345&color=red"}

URI 전체 URI와 일치합니다. 5

입력: https://user:password@example.com/path/to/resource?param1=value1&param2=value2

패턴: %{URI:uri}

출력: {"path":"https://user:password@example.com/path/to/resource?param1=value1&param2=value2"}

날짜/시간 Grok 패턴

Grok 패턴 설명 최대 패턴 제한 예제
MONTH 전체 또는 축약된 영어 월 이름과 전체 단어로 일치합니다. 20

입력: Jan

패턴: %{MONTH:month}

출력: {"month":"Jan"}

입력: January

패턴: %{MONTH:month}

출력: {"month":"January"}

MONTHNUM 1에서 12까지의 월 수와 일치하며, 한 자릿수 월의 경우 선택적으로 앞에 0이 표시됩니다. 20

입력: 5

패턴: %{MONTHNUM:month}

출력: {"month":"5"}

입력: 05

패턴: %{MONTHNUM:month}

출력: {"month":"05"}

MONTHNUM2 01에서 12까지의 두 자리 숫자와 일치합니다. 20

입력: 05

패턴: %{MONTHNUM2:month}

출력: {"month":"05"}

MONTHDAY 1에서 31까지의 일과 일치하며, 선택적으로 앞에 0이 표시됩니다. 20

입력: 31

패턴: %{MONTHDAY:monthDay}

출력: {"monthDay":"31"}

YEAR 2자리 또는 4자리 연도와 일치합니다. 20

입력: 2024

패턴: %{YEAR:year}

출력: {"year":"2024"}

입력: 24

패턴: %{YEAR:year}

출력: {"year":"24"}

DAY 전체 또는 축약된 요일 이름과 일치합니다. 20

입력: Tuesday

패턴: %{DAY:day}

출력: {"day":"Tuesday"}

시간 24시간 형식의 시간(0~23)과 일치하며, 선택적으로 앞에 영(0)이 표시됩니다. 20

입력: 22

패턴: %{HOUR:hour}

출력: {"hour":"22"}

분(00~59)과 일치합니다. 20

입력: 59

패턴: %{MINUTE:min}

출력: {"min":"59"}

SECOND 초((0)0~60)를 나타내는 숫자와 일치하며, 선택적으로 그 뒤에 소수점 또는 콜론과 소수 분을 나타내는 하나 이상의 숫자가 옵니다. 20

입력: 3

패턴: %{SECOND:second}

출력: {"second":"3"}

입력: 30.5

패턴: %{SECOND:minSec}

출력: {"minSec":"30.5"}

입력: 30:5

패턴: %{SECOND:minSec}

출력: {"minSec":"30:5"}

TIME 시간, 분 및 초가 (H)H:mm:(s)s 형식인 시간 형식과 일치합니다. 초에는 윤초(0)0~60이 포함됩니다. 20

입력: 09:45:32

패턴: %{TIME:time}

출력: {"time":"09:45:32"}

DATE_US (M)M/(d)d/(yy)yy 또는 (M)M-(d)d-(yy)yy 형식의 날짜와 일치합니다. 20

입력: 11/23/2024

패턴: %{DATE_US:date}

출력: {"date":"11/23/2024"}

입력: 1-01-24

패턴: %{DATE_US:date}

출력: {"date":"1-01-24"}

DATE_EU (d)d/(M)M/(yy)yy, (d)d-(M)M-(yy)yy 또는 (d)d.(M)M.(yy)yy 형식의 날짜와 일치합니다. 20

입력: 23/11/2024

패턴: %{DATE_EU:date}

출력: {"date":"23/11/2024"}

입력: 1.01.24

패턴: %{DATE_EU:date}

출력: {"date":"1.01.24"}

ISO8601_TIMEZONE UTC 오프셋 'Z' 또는 선택적 콜론이 포함된 시간대 오프셋과 [+-](H)H(:)mm 형식으로 일치합니다. 20

입력: +05:30

패턴: %{ISO8601_TIMEZONE:tz}

출력: {"tz":"+05:30"}

입력: -530

패턴: %{ISO8601_TIMEZONE:tz}

출력: {"tz":"-530"}

입력: Z

패턴: %{ISO8601_TIMEZONE:tz}

출력: {"tz":"Z"}

ISO8601_SECOND 초((0)0~60)를 나타내는 숫자와 일치하며, 선택적으로 그 뒤에 소수점 또는 콜론과 소수 초를 나타내는 하나 이상의 숫자가 옵니다. 20

입력: 60

패턴: %{ISO8601_SECOND:second}

출력: {"second":"60"}

TIMESTAMP_ISO8601 선택적 초 및 시간대가 포함된 ISO8601 날짜/시간 형식 (yy)yy-(M)M-(d)dT(H)H:mm:((s)s)(Z|[+-](H)H:mm)과 일치합니다. 20

입력: 2023-05-15T14:30:00+05:30

패턴: %{TIMESTAMP_ISO8601:timestamp}

출력: {"timestamp":"2023-05-15T14:30:00+05:30"}

입력: 23-5-1T1:25+5:30

패턴: %{TIMESTAMP_ISO8601:timestamp}

출력: {"timestamp":"23-5-1T1:25+5:30"}

입력: 23-5-1T1:25Z

패턴: %{TIMESTAMP_ISO8601:timestamp}

출력: {"timestamp":"23-5-1T1:25Z"}

날짜 %{DATE_US}를 사용하는 미국 형식 또는 %{DATE_EU}를 사용하는 EU 형식의 날짜와 일치합니다. 20

입력: 11/29/2024

패턴: %{DATE:date}

출력: {"date":"11/29/2024"}

입력: 29.11.2024

패턴: %{DATE:date}

출력: {"date":"29.11.2024"}

DATESTAMP 공백 또는 하이픈으로 구분된 %{DATE} 뒤에 %{TIME}이 오는 패턴과 일치합니다. 20

입력: 29-11-2024 14:30:00

패턴: %{DATESTAMP:dateTime}

출력: {"dateTime":"29-11-2024 14:30:00"}

TZ 공통 시간대 약어(PST, PDT, MST, MDT, CST CDT, EST, EDT, UTC)와 일치합니다. 20

입력: PDT

패턴: %{TZ:tz}

출력: {"tz":"PDT"}

DATESTAMP_RFC822 Day MonthName (D)D (YY)YY (H)H:mm:(s)s Timezone 형식의 날짜/시간과 일치합니다. 20

입력: Monday Jan 5 23 1:30:00 CDT

패턴: %{DATESTAMP_RFC822:dateTime}

출력: {"dateTime":"Monday Jan 5 23 1:30:00 CDT"}

입력: Mon January 15 2023 14:30:00 PST

패턴: %{DATESTAMP_RFC822:dateTime}

출력: {"dateTime":"Mon January 15 2023 14:30:00 PST"}

DATESTAMP_RFC2822 Day, (d)d MonthName (yy)yy (H)H:mm:(s)s Z|[+-](H)H:mm 형식의 RFC2822 날짜/시간과 일치합니다. 20

입력: Mon, 15 May 2023 14:30:00 +0530

패턴: %{DATESTAMP_RFC2822:dateTime}

출력: {"dateTime":"Mon, 15 May 2023 14:30:00 +0530"}

입력: Monday, 15 Jan 23 14:30:00 Z

패턴: %{DATESTAMP_RFC2822:dateTime}

출력: {"dateTime":"Monday, 15 Jan 23 14:30:00 Z"}

DATESTAMP_OTHER Day MonthName (d)d (H)H:mm:(s)s Timezone (yy)yy 형식의 날짜/시간과 일치합니다. 20

입력: Mon May 15 14:30:00 PST 2023

패턴: %{DATESTAMP_OTHER:dateTime}

출력: {"dateTime":"Mon May 15 14:30:00 PST 2023"}

DATESTAMP_EVENTLOG 구분자가 없는 압축 날짜/시간((yy)yyMM(d)d(H)Hmm(s)s)과 일치합니다. 20

입력: 20230515143000

패턴: %{DATESTAMP_EVENTLOG:dateTime}

출력: {"dateTime":"20230515143000"}

로그 grok 패턴

Grok 패턴 설명 최대 패턴 제한 예제
LOGLEVEL Alert/ALERT, Trace/TRACE, Debug/DEBUG, Notice/NOTICE, Info/INFO, Warn/Warning/WARN/WARNING, Err/Error/ERR/ERROR, Crit/Critical/CRIT/CRITICAL, Fatal/FATAL, Severe/SEVERE, Emerg/Emergency/EMERG/EMERGENCY를 포함하여 다양한 대문자 및 약어의 표준 로그 수준과 일치합니다. 20

입력: INFO

패턴: %{LOGLEVEL:logLevel}

출력: {"logLevel":"INFO"}

HTTPDATE 로그 파일에 자주 사용되는 날짜/시간 형식과 일치합니다. 형식: (d)d/MonthName/(yy)yy:(H)H:mm:(s)s Timezone MonthName: 전체 또는 축약된 영어 월 이름과 일치합니다(예: 'Jan' 또는 'January'). Timezone: %{INT} grok 패턴과 일치합니다. 20

입력: 23/Nov/2024:14:30:00 +0640

패턴: %{HTTPDATE:date}

출력: {"date":"23/Nov/2024:14:30:00 +0640"}

SYSLOGTIMESTAMP MonthName (d)d (H)H:mm:(s)s 날짜 형식과 일치합니다. MonthName: 전체 또는 축약된 영어 월 이름과 일치합니다(예: 'Jan' 또는 'January'). 20

입력: Nov 29 14:30:00

패턴: %{SYSLOGTIMESTAMP:dateTime}

출력: {"dateTime":"Nov 29 14:30:00"}

PROG 문자, 숫자, 점, 밑줄, 슬래시, 백분율 기호 및 하이픈 문자로 구성된 문자열로 구성된 프로그램 이름과 일치합니다. 20

입력: user.profile/settings-page

패턴: %{PROG:program}

출력: {"program":"user.profile/settings-page"}

SYSLOGPROG PROG grok 패턴과 일치하며, 선택적으로 그 뒤에 대괄호로 묶인 프로세스 ID가 옵니다. 20

입력: user.profile/settings-page[1234]

패턴: %{SYSLOGPROG:programWithId}

출력: {"programWithId":"user.profile/settings-page[1234]","program":"user.profile/settings-page","pid":"1234"}

SYSLOGHOST %{HOST} 또는 %{IP} 패턴과 일치합니다. 5

입력: 2001:db8:3333:4444:5555:6666:7777:8888

패턴: %{SYSLOGHOST:ip}

출력: {"ip": "2001:db8:3333:4444:5555:6666:7777:8888"}

SYSLOGFACILITY 십진수 형식의 syslog 우선 순위와 일치합니다. 값은 각진 대괄호(<>)로 묶어야 합니다. 20

입력: <13.6>

패턴: %{SYSLOGFACILITY:syslog}

출력: {"syslog":"<13.6>","facility":"13","priority":"6"}

일반적인 로그 grok 패턴

사전 정의된 사용자 지정 grok 패턴을 사용하여 Apache, NGINX 및 Syslog Protocol(RFC 5424) 로그 형식을 매칭할 수 있습니다. 이러한 특정 패턴을 사용하는 경우 매칭 구성의 첫 번째 패턴이어야 하며, 다른 패턴보다 우선할 수 없습니다. 또한 정확히 하나의 데이터로만 추적할 수 있습니다. GREEDYDATA 또는 GREEDYDATA_MULTILINE 패턴.

Grok 패턴 설명 최대 패턴 제한

APACHE_ACCESS_LOG

Apache 액세스 로그와 일치합니다.

1

NGINX_ACCESS_LOG

NGINX 액세스 로그와 일치합니다.

1

SYSLOG5424

Syslog 프로토콜(RFC 5424) 로그와 일치합니다.

1

다음은 이러한 일반적인 로그 형식 패턴을 사용하기 위한 유효한 예제와 잘못된 예제입니다.

"%{NGINX_ACCESS_LOG} %{DATA}" // Valid "%{SYSLOG5424}%{DATA:logMsg}" // Valid "%{APACHE_ACCESS_LOG} %{GREEDYDATA:logMsg}" // Valid "%{APACHE_ACCESS_LOG} %{SYSLOG5424}" // Invalid (multiple common log patterns used) "%{NGINX_ACCESS_LOG} %{NUMBER:num}" // Invalid (Only GREEDYDATA and DATA patterns are supported with common log patterns) "%{GREEDYDATA:logMsg} %{SYSLOG5424}" // Invalid (GREEDYDATA and DATA patterns are supported only after common log patterns)

일반적인 로그 형식 예제

Apache 로그 예제

샘플 로그:

127.0.0.1 - - [03/Aug/2023:12:34:56 +0000] "GET /page.html HTTP/1.1" 200 1234

변환기:

[ { "grok": { "match": "%{APACHE_ACCESS_LOG}" } } ]

출력:

{ "request": "/page.html", "http_method": "GET", "status_code": 200, "http_version": "1.1", "response_size": 1234, "remote_host": "127.0.0.1", "timestamp": "2023-08-03T12:34:56Z" }
NGINX 로그 예제

샘플 로그:

192.168.1.100 - Foo [03/Aug/2023:12:34:56 +0000] "GET /account/login.html HTTP/1.1" 200 42 "https://www.amazon.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"

변환기:

[ { "grok": { "match": "%{NGINX_ACCESS_LOG}" } } ]

출력:

{ "request": "/account/login.html", "referrer": "https://www.amazon.com/", "agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "http_method": "GET", "status_code": 200, "auth_user": "Foo", "http_version": "1.1", "response_size": 42, "remote_host": "192.168.1.100", "timestamp": "2023-08-03T12:34:56Z" }
Syslog 프로토콜(RFC 5424) 로그 예제

샘플 로그:

<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource= "Application" eventID="1011"][examplePriority@32473 class="high"]

변환기:

[ { "grok": { "match": "%{SYSLOG5424}" } } ]

출력:

{ "pri": 165, "version": 1, "timestamp": "2003-10-11T22:14:15.003Z", "hostname": "mymachine.example.com", "app": "evntslog", "msg_id": "ID47", "structured_data": "exampleSDID@32473 iut=\"3\" eventSource= \"Application\" eventID=\"1011\"", "message": "[examplePriority@32473 class=\"high\"]" }

csv

csv 프로세서는 로그 이벤트의 쉼표로 구분된 값(CSV)을 열로 구문 분석합니다.

필드 설명 필수 기본값 제한 사항

source

구문 분석할 로그 이벤트의 필드 경로

아니요

@message

최대 길이: 128

최대 중첩 키 깊이: 3

delimiter

원래 쉼표로 구분된 값 로그 이벤트에서 각 열을 구분하는 데 사용되는 문자

아니요

,

최대 길이: 값이 \t 또는 \s이 아닌 경우 1

quoteCharacter

단일 데이터 열에 대한 텍스트 한정자로 사용되는 문자

아니요

"

최대 길이: 1

columns

변환된 로그 이벤트의 열에 사용할 이름의 목록.

아니요

[column_1, column_2 ...]

최대 CSV 열: 100

최대 길이: 128

최대 중첩 키 깊이: 3

delimiter\t로 설정하면 탭 문자에서 각 열이 구분되며, \t은 단일 공백 문자에서 각 열을 구분합니다.

예제

수집된 로그 이벤트의 일부가 다음과 같다고 가정해 보겠습니다.

'Akua Mansa':28:'New York: USA'

csv 프로세서만 사용한다고 가정해 보겠습니다.

[ { "csv": { "delimiter": ":", "quoteCharacter": "'" } } ]

변환된 로그 이벤트는 다음과 같습니다.

{ "column_1": "Akua Mansa", "column_2": "28", "column_3": "New York: USA" }

parseKeyValue

parseKeyValue 프로세서를 사용하여 지정된 필드를 키-값 쌍으로 구문 분석합니다. 다음 옵션을 사용하여 필드 정보를 구문 분석하도록 프로세서를 사용자 지정할 수 있습니다.

필드 설명 필수 기본값 제한 사항

source

구문 분석할 로그 이벤트의 필드 경로

아니요

@message

최대 길이: 128

최대 중첩 키 깊이: 3

대상

추출된 키-값 쌍을 넣을 대상 필드

아니요

최대 길이: 128

fieldDelimiter

원래 로그 이벤트의 키-값 쌍 간에 사용되는 필드 구분 문자 문자열.

아니요

&

최대 길이: 128

keyValueDelimiter

변환된 로그 이벤트의 각 쌍에서 키와 값 사이에 사용할 구분 문자 문자열

아니요

=

최대 길이: 128

nonMatchValue

키-값 쌍이 성공적으로 분할되지 않은 경우 결과의 값 필드에 삽입할 값.

아니요

최대 길이: 128

keyPrefix

변환된 모든 키에 접두사를 추가하려면 여기에 지정합니다.

아니요

최대 길이: 128

overwriteIfExists

대상 키가 이미 있는 경우 값을 덮어쓸지 여부

아니요

false

예제

다음 예제 로그 이벤트를 살펴봅니다.

key1:value1!key2:value2!key3:value3!key4

다음 프로세서 구성을 사용한다고 가정해 보겠습니다.

[ { "parseKeyValue": { "destination": "new_key", "fieldDelimiter": "!", "keyValueDelimiter": ":", "nonMatchValue": "defaultValue", "keyPrefix": "parsed_" } } ]

변환된 로그 이벤트는 다음과 같습니다.

{ "new_key": { "parsed_key1": "value1", "parsed_key2": "value2", "parsed_key3": "value3", "parsed_key4": "defaultValue" } }