

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

# 구성 가능한 구문 분석기 유형 프로세서
<a name="CloudWatch-Logs-Transformation-Configurable"></a>

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

**Contents**
+ [

## parseJSON
](#CloudWatch-Logs-Transformation-parseJSON)
+ [

## grok
](#CloudWatch-Logs-Transformation-Grok)
  + [

### Grok 예제
](#Grok-Examples)
    + [

#### 예제 1: grok를 사용하여 비정형 로그에서 필드 추출
](#Grok-Example1)
    + [

#### 예제 2: parseJSON과 함께 grok를 사용하여 JSON 로그 이벤트에서 필드 추출
](#Grok-Example3)
    + [

#### 예제 3: FIELD\$1NAME에 점 주석이 있는 Grok 패턴
](#Grok-Example4)
  + [

### 지원되는 grok 패턴
](#Grok-Patterns)
    + [

#### 일반적인 로그 형식 예제
](#Common-Log-Examples)
      + [

##### Apache 로그 예제
](#Apache-Log-Example)
      + [

##### NGINX 로그 예제
](#NGINX-Log-Example)
      + [

##### Syslog 프로토콜(RFC 5424) 로그 예제
](#syslog5424-Log-Example)
+ [

## csv
](#CloudWatch-Logs-Transformation-csv)
+ [

## parseKeyValue
](#CloudWatch-Logs-Transformation-parseKeyValue)

## parseJSON
<a name="CloudWatch-Logs-Transformation-parseJSON"></a>

**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
<a name="CloudWatch-Logs-Transformation-Grok"></a>

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


| 필드 | 설명 | 필수 | 기본값 | 제한 사항 | 참고 사항 | 
| --- | --- | --- | --- | --- | --- | 
|  source | Grok 매칭을 적용할 필드의 경로 |  아니요 | `@message`  | 최대 길이: 128 최대 중첩 키 깊이: 3 | 
|  match | 로그 이벤트와 매칭할 grok 패턴  |  예 |  | 최대 길이: 512 최대 grok 패턴: 20 일부 grok 패턴 유형에는 개별 사용량 제한이 있습니다. \$1URI, URIPARAM, URIPATHPARAM, SPACE, DATA, GREEDYDATA, GREEDYDATA\$1MULTILINE\$1 패턴의 조합은 최대 5회까지 사용할 수 있습니다. Grok 패턴은 유형 변환을 지원하지 않습니다. 일반적인 로그 형식 패턴(APACHE\$1ACCESS\$1LOG, NGINX\$1ACCESS\$1LOG, SYSLOG5424)의 경우 일반적인 로그 패턴 뒤에는 DATA, GREEDYDATA 또는 GREEDYDATA\$1MULTILINE 패턴만 포함될 수 있습니다.  | [지원되는 모든 Grok 패턴 보기](#Grok-Patterns) | 

**Grok 패턴의 구조**

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

```
%{PATTERN_NAME:FIELD_NAME}
```
+ **PATTERN\$1NAME**: 특정 유형의 데이터와 일치시키기 위해 미리 정의된 정규식을 나타냅니다. 사전 정의된 [grok 패턴](#Grok-Patterns)만 지원됩니다. 사용자 지정 패턴 생성은 허용되지 않습니다.
+ **FIELD\$1NAME**: 추출된 값에 이름을 할당합니다. `FIELD_NAME`은 선택 사항이지만 이 값을 지정하지 않으면 추출된 데이터가 변환된 로그 이벤트에서 삭제됩니다. `FIELD_NAME`은 점 표기법(예: 'parent.child')을 사용하는 경우 JSON 경로로 간주됩니다.
+ **유형 변환**: 명시적 유형 변환은 지원되지 않습니다. [TypeConverter 프로세서](CloudWatch-Logs-Transformation-Datatype.md#CloudWatch-Logs-Transformation-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 예제
<a name="Grok-Examples"></a>

#### 예제 1: grok를 사용하여 비정형 로그에서 필드 추출
<a name="Grok-Example1"></a>

샘플 로그:

```
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 로그 이벤트에서 필드 추출
<a name="Grok-Example3"></a>

샘플 로그:

```
{
    "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\$1NAME에 점 주석이 있는 Grok 패턴
<a name="Grok-Example4"></a>

샘플 로그:

```
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 패턴
<a name="Grok-Patterns"></a>

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

**일반 grok 패턴**


| Grok 패턴 | 설명 | 최대 패턴 제한 | 예제 | 
| --- | --- | --- | --- | 
| 사용자 이름 또는 사용자 | 소문자(a\$1z), 대문자(A\$1Z), 숫자(0\$19), 점(.), 밑줄(\$1) 또는 하이픈(-)을 포함할 수 있는 하나 이상의 문자와 일치합니다. | 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진수와 선택적 기호(\$1 또는 -) 및 선택적 0x 접두사와 일치합니다. | 20 |  입력: `+0xA1B2` 패턴: `%{BASE16NUM:num}` 출력: `{"num": "+0xA1B2"}`  | 
| POSINT | 하나 이상의 숫자(1\$19 다음에 0\$19)로 구성된 앞에 0이 없는 정수와 일치합니다. | 20 |  입력: `123` 패턴: `%{POSINT:num}` 출력: `{"num": "123"}`  | 
| NONNEGINT | 0과 앞에 0이 있는 숫자를 포함하여 모든 정수(0\$19의 숫자로 구성)와 일치합니다. | 20 |  입력: `007` 패턴: `%{NONNEGINT:num}` 출력: `{"num": "007"}`  | 
| WORD | 문자, 숫자 및 밑줄을 포함하여 하나 이상의 단어 문자(\$1w)로 구성된 전체 단어와 일치합니다.. | 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\$1MULTILINE | 모든 문자(줄 바꿈 포함)와 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 | %\$1IPv6\$1에서 지원하는 IPv6 주소 또는 %\$1IPv4\$1에서 지원하는 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 | %\$1IPORHOST\$1 패턴에서 지원하는 IP 주소 또는 호스트 이름과 일치하고, 그 뒤에 콜론과 포트 번호가 오며, 출력에서 포트를 'PORT'로 캡처합니다. | 5 |  입력: `192.168.1.1:8080` 패턴: `%{HOSTPORT:ip}` 출력: `{"ip":"192.168.1.1:8080","PORT":"8080"}`  | 
| URIHOST | %\$1IPORHOST\$1 패턴에서 지원하는 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 | 문자와 일치하며, 선택적으로 그 뒤에 더하기(\$1) 문자와 추가 문자 또는 더하기(\$1) 문자가 옵니다. | 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\$123)과 일치하며, 선택적으로 앞에 영(0)이 표시됩니다. | 20 |  입력: `22` 패턴: `%{HOUR:hour}` 출력: `{"hour":"22"}`  | 
| 분 | 분(00\$159)과 일치합니다. | 20 |  입력: `59` 패턴: `%{MINUTE:min}` 출력: `{"min":"59"}`  | 
| SECOND | 초((0)0\$160)를 나타내는 숫자와 일치하며, 선택적으로 그 뒤에 소수점 또는 콜론과 소수 분을 나타내는 하나 이상의 숫자가 옵니다. | 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\$160이 포함됩니다. | 20 |  입력: `09:45:32` 패턴: `%{TIME:time}` 출력: `{"time":"09:45:32"}`  | 
| DATE\$1US | (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\$1EU | (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\$1TIMEZONE | UTC 오프셋 'Z' 또는 선택적 콜론이 포함된 시간대 오프셋과 [\$1-](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\$1SECOND | 초((0)0\$160)를 나타내는 숫자와 일치하며, 선택적으로 그 뒤에 소수점 또는 콜론과 소수 초를 나타내는 하나 이상의 숫자가 옵니다. | 20 |  입력: `60` 패턴: `%{ISO8601_SECOND:second}` 출력: `{"second":"60"}`  | 
| TIMESTAMP\$1ISO8601 | 선택적 초 및 시간대가 포함된 ISO8601 날짜/시간 형식 (yy)yy-(M)M-(d)dT(H)H:mm:((s)s)(Z\$1[\$1-](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 | %\$1DATE\$1US\$1를 사용하는 미국 형식 또는 %\$1DATE\$1EU\$1를 사용하는 EU 형식의 날짜와 일치합니다. | 20 |  입력: `11/29/2024` 패턴: `%{DATE:date}` 출력: `{"date":"11/29/2024"}` 입력: `29.11.2024` 패턴: `%{DATE:date}` 출력: `{"date":"29.11.2024"}`  | 
| DATESTAMP | 공백 또는 하이픈으로 구분된 %\$1DATE\$1 뒤에 %\$1TIME\$1이 오는 패턴과 일치합니다. | 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\$1RFC822 | 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\$1RFC2822 | Day, (d)d MonthName (yy)yy (H)H:mm:(s)s Z\$1[\$1-](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\$1OTHER | 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\$1EVENTLOG | 구분자가 없는 압축 날짜/시간((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: %\$1INT\$1 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 | %\$1HOST\$1 또는 %\$1IP\$1 패턴과 일치합니다. | 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\$1MULTILINE** 패턴.


| Grok 패턴 | 설명 | 최대 패턴 제한 | 
| --- | --- | --- | 
|  APACHE\$1ACCESS\$1LOG | Apache 액세스 로그와 일치합니다. | 1 | 
|  NGINX\$1ACCESS\$1LOG | 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)
```

#### 일반적인 로그 형식 예제
<a name="Common-Log-Examples"></a>

##### Apache 로그 예제
<a name="Apache-Log-Example"></a>

샘플 로그:

```
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 로그 예제
<a name="NGINX-Log-Example"></a>

샘플 로그:

```
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) 로그 예제
<a name="syslog5424-Log-Example"></a>

샘플 로그:

```
<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
<a name="CloudWatch-Logs-Transformation-csv"></a>

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


| 필드 | 설명 | 필수 | 기본값 | 제한 사항 | 
| --- | --- | --- | --- | --- | 
|  source | 구문 분석할 로그 이벤트의 필드 경로 |  아니요 | `@message`  | 최대 길이: 128 최대 중첩 키 깊이: 3 | 
|  delimiter | 원래 쉼표로 구분된 값 로그 이벤트에서 각 열을 구분하는 데 사용되는 문자 |  아니요 | `,`  | 최대 길이: 값이 `\t` 또는 `\s`이 아닌 경우 1  | 
|  quoteCharacter | 단일 데이터 열에 대한 텍스트 한정자로 사용되는 문자 |  아니요 | `"`  | 최대 길이: 1  | 
|  columns | 변환된 로그 이벤트의 열에 사용할 이름의 목록. |  아니요 | `[column_1, column_2 ...]`  | 최대 CSV 열: 100 최대 길이: 128 최대 중첩 키 깊이: 3  | 
|  대상 | 변환된 키 값 페어를 넣을 상위 필드입니다. |  아니요 | `Root node`  | 최대 길이: 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"
}
```

**예제 2**

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

```
{
    "timestamp": "2024-11-23T16:03:12Z",
    "type": "user_data",
    "logMsg": "'Akua Mansa':28:'New York: USA'"
}
```

이벤트를 JSON으로 구문 분석하고 열 이름과 대상을 지정하여 **csv** 프로세서로 JSON 필드를 구문 분석한다고 가정해 보겠습니다.

```
[
    {
        "parseJSON": {}
    },
    {
        "csv": {
            "source": "logMsg",
            "delimiter": ":",
            "quoteCharacter": "'",
            "columns":["name","age","location"],
            "destination": "msg"
        }
    }
]
```

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

```
{
    "timestamp": "2024-11-23T16:03:12Z",
    "logMsg": "'Akua Mansa':28:'New York: USA'",
    "type": "user_data",
    "msg": {
        "name": "Akua Mansa",
        "age": "28",
        "location": "New York: USA"
    }
}
```

## parseKeyValue
<a name="CloudWatch-Logs-Transformation-parseKeyValue"></a>

**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"
  }
}
```