

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

# 구성 가능한 구문 분석기 유형 프로세서
<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\_NAME에 점 주석이 있는 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<br />최대 중첩 키 깊이: 3 | 
| 대상 | 구문 분석된 JSON의 대상 필드 | 아니요 | `Parent JSON node` | 최대 길이: 128<br />최대 중첩 키 깊이: 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<br />최대 중첩 키 깊이: 3 | 
| match | 로그 이벤트와 매칭할 grok 패턴<br /> | 예 |  | 최대 길이: 512<br />최대 grok 패턴: 20<br />일부 grok 패턴 유형에는 개별 사용량 제한이 있습니다. {URI, URIPARAM, URIPATHPARAM, SPACE, DATA, GREEDYDATA, GREEDYDATA\_MULTILINE} 패턴의 조합은 최대 5회까지 사용할 수 있습니다.<br />Grok 패턴은 유형 변환을 지원하지 않습니다.<br />일반적인 로그 형식 패턴(APACHE\_ACCESS\_LOG, NGINX\_ACCESS\_LOG, SYSLOG5424)의 경우 일반적인 로그 패턴 뒤에는 DATA, GREEDYDATA 또는 GREEDYDATA\_MULTILINE 패턴만 포함될 수 있습니다. | [지원되는 모든 Grok 패턴 보기](#Grok-Patterns) | 

**Grok 패턴의 구조**

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

```
%{PATTERN_NAME:FIELD_NAME}
```
+ **PATTERN\_NAME**: 특정 유형의 데이터와 일치시키기 위해 미리 정의된 정규식을 나타냅니다. 사전 정의된 [grok 패턴](#Grok-Patterns)만 지원됩니다. 사용자 지정 패턴 생성은 허용되지 않습니다.
+ **FIELD\_NAME**: 추출된 값에 이름을 할당합니다. `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\_NAME에 점 주석이 있는 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\~z), 대문자(A\~Z), 숫자(0\~9), 점(.), 밑줄(\_) 또는 하이픈(-)을 포함할 수 있는 하나 이상의 문자와 일치합니다. | 20 | 입력: `user123.name-TEST`<br />패턴: `%{USERNAME:name}`<br />출력: `{"name": "user123.name-TEST"}` | 
| INT | 선택 사항인 더하기 또는 빼기 기호 뒤에 하나 이상의 숫자가 오는 것과 일치합니다. | 20 | 입력: `-456`<br />패턴: `%{INT:num}`<br />출력: `{"num": "-456"}` | 
| BASE10NUM | 부호 및 소수점 옵션이 있는 정수 또는 부동 소수점 숫자와 일치합니다. | 20 | 입력: `-0.67`<br />패턴: `%{BASE10NUM:num}`<br />출력: `{"num": "-0.67"}` | 
| BASE16NUM | 10진수 및 16진수와 선택적 기호(\+ 또는 -) 및 선택적 0x 접두사와 일치합니다. | 20 | 입력: `+0xA1B2`<br />패턴: `%{BASE16NUM:num}`<br />출력: `{"num": "+0xA1B2"}` | 
| POSINT | 하나 이상의 숫자(1\~9 다음에 0\~9)로 구성된 앞에 0이 없는 정수와 일치합니다. | 20 | 입력: `123`<br />패턴: `%{POSINT:num}`<br />출력: `{"num": "123"}` | 
| NONNEGINT | 0과 앞에 0이 있는 숫자를 포함하여 모든 정수(0\~9의 숫자로 구성)와 일치합니다. | 20 | 입력: `007`<br />패턴: `%{NONNEGINT:num}`<br />출력: `{"num": "007"}` | 
| WORD | 문자, 숫자 및 밑줄을 포함하여 하나 이상의 단어 문자(\\w)로 구성된 전체 단어와 일치합니다.. | 20 | 입력: `user_123`<br />패턴: `%{WORD:user}`<br />출력: `{"user": "user_123"}` | 
| NOTSPACE | 공백이 없는 하나 이상의 문자와 일치합니다. | 5 | 입력: `hello_world123`<br />패턴: `%{NOTSPACE:msg}`<br />출력: `{"msg": "hello_world123"}` | 
| SPACE | 0개 이상의 공백 문자와 일치합니다. | 5 | 입력: `" "`<br />패턴: `%{SPACE:extra}`<br />출력: `{"extra": " "}` | 
| DATA | 모든 문자(줄 바꿈 제외)와 0회 이상 최소 일치합니다. | 5 | 입력: `abc def ghi`<br />패턴: `%{DATA:x} %{DATA:y}`<br />출력: `{"x": "abc", "y": "def ghi"}` | 
| GREEDYDATA | 모든 문자(줄 바꿈 제외)와 0회 이상 최대 일치합니다. | 5 | 입력: `abc def ghi`<br />패턴: `%{GREEDYDATA:x} %{GREEDYDATA:y}`<br />출력: `{"x": "abc def", "y": "ghi"}` | 
| GREEDYDATA\_MULTILINE | 모든 문자(줄 바꿈 포함)와 0회 이상 최대 일치합니다. | 1 | 입력:<br />`abc`<br />`def`<br />`ghi`<br />패턴: `%{GREEDYDATA_MULTILINE:data}`<br />출력: `{"data": "abc\ndef\nghi"}` | 
| QUOTEDSTRING | 이스케이프 처리된 문자가 포함된 따옴표(작은따옴표 또는 큰따옴표)로 묶인 문자열과 일치합니다. | 20 | 입력: `"Hello, world!"`<br />패턴: `%{QUOTEDSTRING:msg}`<br />출력: `{"msg": "Hello, world!"}` | 
| UUID | 표준 UUID 형식과 일치합니다. 즉, 8개의 16진수 문자 뒤에 4개의 16진수 문자로 구성된 3개의 그룹이 오고 12개의 16진수 문자로 끝나며, 모두 하이픈으로 구분됩니다. | 20 | 입력: `550e8400-e29b-41d4-a716-446655440000`<br />패턴: `%{UUID:id}`<br />출력: `{"id": "550e8400-e29b-41d4-a716-446655440000"}` | 
| urn | URN(Uniform Resource Name) 구문과 일치합니다. | 20 | 입력: `urn:isbn:0451450523`<br />패턴: `%{URN:urn}`<br />출력: `{"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`<br />패턴: `%{ARN:arn}`<br />출력: `{"arn": "arn:aws:iam:us-east-1:123456789012:user/johndoe"}` | 

**네트워킹 grok 패턴**


| Grok 패턴 | 설명 | 최대 패턴 제한 | 예제 | 
| --- | --- | --- | --- | 
| CISCOMAC | 4-4-4 16진수 형식의 MAC 주소와 일치합니다. | 20 | 입력: `0123.4567.89AB`<br />패턴: `%{CISCOMAC:MacAddress}`<br />출력: `{"MacAddress": "0123.4567.89AB"}` | 
| WINDOWSMAC | 하이픈이 포함된 16진수 형식의 MAC 주소와 일치합니다. | 20 | 입력: `01-23-45-67-89-AB`<br />패턴: `%{WINDOWSMAC:MacAddress}`<br />출력: `{"MacAddress": "01-23-45-67-89-AB"}` | 
| COMMONMAC | 콜론이 포함된 16진수 형식의 MAC 주소와 일치합니다. | 20 | 입력: `01:23:45:67:89:AB`<br />패턴: `%{COMMONMAC:MacAddress}`<br />출력: `{"MacAddress": "01:23:45:67:89:AB"}` | 
| MAC | CISCOMAC, WINDOWSMAC 또는 COMMONMAC grok 패턴 중 하나와 일치합니다. | 20 | 입력: `01:23:45:67:89:AB`<br />패턴: `%{MAC:m1}`<br />출력: `{"m1":"01:23:45:67:89:AB"}` | 
| IPV6 | 압축된 양식 및 IPv4 매핑된 IPv6 주소를 포함한 IPv6 주소와 일치합니다. | 5 | 입력: `2001:db8:3333:4444:5555:6666:7777:8888`<br />패턴: `%{IPV6:ip}`<br />출력: `{"ip": "2001:db8:3333:4444:5555:6666:7777:8888"}` | 
| IPV4 | IPv4 주소와 일치합니다. | 20 | 입력: `192.168.0.1`<br />패턴: `%{IPV4:ip}`<br />출력: `{"ip": "192.168.0.1"}` | 
| IP | %{IPv6}에서 지원하는 IPv6 주소 또는 %{IPv4}에서 지원하는 IPv4 주소 중 하나와 일치합니다. | 5 | 입력: `192.168.0.1`<br />패턴: `%{IP:ip}`<br />출력: `{"ip": "192.168.0.1"}` | 
| HOSTNAME 또는 HOST | 하위 도메인을 포함한 도메인 이름과 일치합니다. | 5 | 입력: `server-01.internal-network.local`<br />패턴: `%{HOST:host}`<br />출력: `{"host": "server-01.internal-network.local"}` | 
| IPORHOST | 호스트 이름 또는 IP 주소와 일치합니다. | 5 | 입력: `2001:db8:3333:4444:5555:6666:7777:8888`<br />패턴: `%{IPORHOST:ip}`<br />출력: `{"ip": "2001:db8:3333:4444:5555:6666:7777:8888"}` | 
| HOSTPORT | %{IPORHOST} 패턴에서 지원하는 IP 주소 또는 호스트 이름과 일치하고, 그 뒤에 콜론과 포트 번호가 오며, 출력에서 포트를 'PORT'로 캡처합니다. | 5 | 입력: `192.168.1.1:8080`<br />패턴: `%{HOSTPORT:ip}`<br />출력: `{"ip":"192.168.1.1:8080","PORT":"8080"}` | 
| URIHOST | %{IPORHOST} 패턴에서 지원하는 IP 주소 또는 호스트 이름과 일치하고, 선택적으로 그 뒤에 콜론과 포트 번호가 오고, 포트가 있는 경우 'port'로 캡처합니다. | 5 | 입력: `example.com:443 10.0.0.1`<br />패턴: `%{URIHOST:host} %{URIHOST:ip}`<br />출력: `{"host":"example.com:443","port":"443","ip":"10.0.0.1"}` | 

**경로 grok 패턴**


| Grok 패턴 | 설명 | 최대 패턴 제한 | 예제 | 
| --- | --- | --- | --- | 
| UNIXPATH | 쿼리 파라미터를 포함할 수 있는 URL 경로와 일치합니다. | 20 | 입력: `/search?q=regex`<br />패턴: `%{UNIXPATH:path}`<br />출력: `{"path":"/search?q=regex"}` | 
| WINPATH | Windows 파일 경로와 일치합니다. | 5 | 입력: `C:\Users\John\Documents\file.txt`<br />패턴: `%{WINPATH:path}`<br />출력: `{"path": "C:\\Users\\John\\Documents\\file.txt"}` | 
| PATH | URL 또는 Windows 파일 경로와 일치합니다. | 5 | 입력: `/search?q=regex`<br />패턴: `%{PATH:path}`<br />출력: `{"path":"/search?q=regex"}` | 
| TTY | 터미널 및 가상 터미널의 Unix 디바이스 경로와 일치합니다. | 20 | 입력: `/dev/tty1`<br />패턴: `%{TTY:path}`<br />출력: `{"path":"/dev/tty1"}` | 
| URIPROTO | 문자와 일치하며, 선택적으로 그 뒤에 더하기(\+) 문자와 추가 문자 또는 더하기(\+) 문자가 옵니다. | 20 | 입력: `web+transformer`<br />패턴: `%{URIPROTO:protocol}`<br />출력: `{"protocol":"web+transformer"}` | 
| URIPATH | URI의 경로 구성 요소와 일치합니다. | 20 | 입력: `/category/sub-category/product_name`<br />패턴: `%{URIPATH:path}`<br />출력: `{"path":"/category/sub-category/product_name"}` | 
| URIPARAM | URL 쿼리 파라미터와 일치합니다. | 5 | 입력: `?param1=value1&param2=value2`<br />패턴: `%{URIPARAM:url}`<br />출력: `{"url":"?param1=value1&param2=value2"}` | 
| URIPATHPARAM | URI 경로와 일치하며, 선택적으로 그 뒤에 쿼리 파라미터가 옵니다. | 5 | 입력: `/category/sub-category/product?id=12345&color=red`<br />패턴: `%{URIPATHPARAM:path}`<br />출력: `{"path":"/category/sub-category/product?id=12345&color=red"}` | 
| URI | 전체 URI와 일치합니다. | 5 | 입력: `https://user:password@example.com/path/to/resource?param1=value1&param2=value2`<br />패턴: `%{URI:uri}`<br />출력: `{"path":"https://user:password@example.com/path/to/resource?param1=value1&param2=value2"}` | 

**날짜/시간 Grok 패턴**


| Grok 패턴 | 설명 | 최대 패턴 제한 | 예제 | 
| --- | --- | --- | --- | 
| MONTH | 전체 또는 축약된 영어 월 이름과 전체 단어로 일치합니다. | 20 | 입력: `Jan`<br />패턴: `%{MONTH:month}`<br />출력: `{"month":"Jan"}`<br />입력: `January`<br />패턴: `%{MONTH:month}`<br />출력: `{"month":"January"}` | 
| MONTHNUM | 1에서 12까지의 월 수와 일치하며, 한 자릿수 월의 경우 선택적으로 앞에 0이 표시됩니다. | 20 | 입력: `5`<br />패턴: `%{MONTHNUM:month}`<br />출력: `{"month":"5"}`<br />입력: `05`<br />패턴: `%{MONTHNUM:month}`<br />출력: `{"month":"05"}` | 
| MONTHNUM2 | 01에서 12까지의 두 자리 숫자와 일치합니다. | 20 | 입력: `05`<br />패턴: `%{MONTHNUM2:month}`<br />출력: `{"month":"05"}` | 
| MONTHDAY | 1에서 31까지의 일과 일치하며, 선택적으로 앞에 0이 표시됩니다. | 20 | 입력: `31`<br />패턴: `%{MONTHDAY:monthDay}`<br />출력: `{"monthDay":"31"}` | 
| YEAR | 2자리 또는 4자리 연도와 일치합니다. | 20 | 입력: `2024`<br />패턴: `%{YEAR:year}`<br />출력: `{"year":"2024"}`<br />입력: `24`<br />패턴: `%{YEAR:year}`<br />출력: `{"year":"24"}` | 
| DAY | 전체 또는 축약된 요일 이름과 일치합니다. | 20 | 입력: `Tuesday`<br />패턴: `%{DAY:day}`<br />출력: `{"day":"Tuesday"}` | 
| 시간 | 24시간 형식의 시간(0\~23)과 일치하며, 선택적으로 앞에 영(0)이 표시됩니다. | 20 | 입력: `22`<br />패턴: `%{HOUR:hour}`<br />출력: `{"hour":"22"}` | 
| 분 | 분(00\~59)과 일치합니다. | 20 | 입력: `59`<br />패턴: `%{MINUTE:min}`<br />출력: `{"min":"59"}` | 
| SECOND | 초((0)0\~60)를 나타내는 숫자와 일치하며, 선택적으로 그 뒤에 소수점 또는 콜론과 소수 분을 나타내는 하나 이상의 숫자가 옵니다. | 20 | 입력: `3`<br />패턴: `%{SECOND:second}`<br />출력: `{"second":"3"}`<br />입력: `30.5`<br />패턴: `%{SECOND:minSec}`<br />출력: `{"minSec":"30.5"}`<br />입력: `30:5`<br />패턴: `%{SECOND:minSec}`<br />출력: `{"minSec":"30:5"}` | 
| TIME | 시간, 분 및 초가 (H)H:mm:(s)s 형식인 시간 형식과 일치합니다. 초에는 윤초(0)0\~60이 포함됩니다. | 20 | 입력: `09:45:32`<br />패턴: `%{TIME:time}`<br />출력: `{"time":"09:45:32"}` | 
| DATE\_US | (M)M/(d)d/(yy)yy 또는 (M)M-(d)d-(yy)yy 형식의 날짜와 일치합니다. | 20 | 입력: `11/23/2024`<br />패턴: `%{DATE_US:date}`<br />출력: `{"date":"11/23/2024"}`<br />입력: `1-01-24`<br />패턴: `%{DATE_US:date}`<br />출력: `{"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`<br />패턴: `%{DATE_EU:date}`<br />출력: `{"date":"23/11/2024"}`<br />입력: `1.01.24`<br />패턴: `%{DATE_EU:date}`<br />출력: `{"date":"1.01.24"}` | 
| ISO8601\_TIMEZONE | UTC 오프셋 'Z' 또는 선택적 콜론이 포함된 시간대 오프셋과 [\+-](H)H(:)mm 형식으로 일치합니다. | 20 | 입력: `+05:30`<br />패턴: `%{ISO8601_TIMEZONE:tz}`<br />출력: `{"tz":"+05:30"}`<br />입력: `-530`<br />패턴: `%{ISO8601_TIMEZONE:tz}`<br />출력: `{"tz":"-530"}`<br />입력: `Z`<br />패턴: `%{ISO8601_TIMEZONE:tz}`<br />출력: `{"tz":"Z"}` | 
| ISO8601\_SECOND | 초((0)0\~60)를 나타내는 숫자와 일치하며, 선택적으로 그 뒤에 소수점 또는 콜론과 소수 초를 나타내는 하나 이상의 숫자가 옵니다. | 20 | 입력: `60`<br />패턴: `%{ISO8601_SECOND:second}`<br />출력: `{"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`<br />패턴: `%{TIMESTAMP_ISO8601:timestamp}`<br />출력: `{"timestamp":"2023-05-15T14:30:00+05:30"}`<br />입력: `23-5-1T1:25+5:30`<br />패턴: `%{TIMESTAMP_ISO8601:timestamp}`<br />출력: `{"timestamp":"23-5-1T1:25+5:30"}`<br />입력: `23-5-1T1:25Z`<br />패턴: `%{TIMESTAMP_ISO8601:timestamp}`<br />출력: `{"timestamp":"23-5-1T1:25Z"}` | 
| DATE | %{DATE\_US}를 사용하는 미국 형식 또는 %{DATE\_EU}를 사용하는 EU 형식의 날짜와 일치합니다. | 20 | 입력: `11/29/2024`<br />패턴: `%{DATE:date}`<br />출력: `{"date":"11/29/2024"}`<br />입력: `29.11.2024`<br />패턴: `%{DATE:date}`<br />출력: `{"date":"29.11.2024"}` | 
| DATESTAMP | 공백 또는 하이픈으로 구분된 %{DATE} 뒤에 %{TIME}이 오는 패턴과 일치합니다. | 20 | 입력: `29-11-2024 14:30:00`<br />패턴: `%{DATESTAMP:dateTime}`<br />출력: `{"dateTime":"29-11-2024 14:30:00"}` | 
| TZ | 공통 시간대 약어(PST, PDT, MST, MDT, CST CDT, EST, EDT, UTC)와 일치합니다. | 20 | 입력: `PDT`<br />패턴: `%{TZ:tz}`<br />출력: `{"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`<br />패턴: `%{DATESTAMP_RFC822:dateTime}`<br />출력: `{"dateTime":"Monday Jan 5 23 1:30:00 CDT"}`<br />입력: `Mon January 15 2023 14:30:00 PST`<br />패턴: `%{DATESTAMP_RFC822:dateTime}`<br />출력: `{"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`<br />패턴: `%{DATESTAMP_RFC2822:dateTime}`<br />출력: `{"dateTime":"Mon, 15 May 2023 14:30:00 +0530"}`<br />입력: `Monday, 15 Jan 23 14:30:00 Z`<br />패턴: `%{DATESTAMP_RFC2822:dateTime}`<br />출력: `{"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`<br />패턴: `%{DATESTAMP_OTHER:dateTime}`<br />출력: `{"dateTime":"Mon May 15 14:30:00 PST 2023"}` | 
| DATESTAMP\_EVENTLOG | 구분자가 없는 압축 날짜/시간((yy)yyMM(d)d(H)Hmm(s)s)과 일치합니다. | 20 | 입력: `20230515143000`<br />패턴: `%{DATESTAMP_EVENTLOG:dateTime}`<br />출력: `{"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`<br />패턴: `%{LOGLEVEL:logLevel}`<br />출력: `{"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`<br />패턴: `%{HTTPDATE:date}`<br />출력: `{"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`<br />패턴: `%{SYSLOGTIMESTAMP:dateTime}`<br />출력: `{"dateTime":"Nov 29 14:30:00"}` | 
| PROG | 문자, 숫자, 점, 밑줄, 슬래시, 백분율 기호 및 하이픈 문자로 구성된 문자열로 구성된 프로그램 이름과 일치합니다. | 20 | 입력: `user.profile/settings-page`<br />패턴: `%{PROG:program}`<br />출력: `{"program":"user.profile/settings-page"}` | 
| SYSLOGPROG | PROG grok 패턴과 일치하며, 선택적으로 그 뒤에 대괄호로 묶인 프로세스 ID가 옵니다. | 20 | 입력: `user.profile/settings-page[1234]`<br />패턴: `%{SYSLOGPROG:programWithId}`<br />출력: `{"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`<br />패턴: `%{SYSLOGHOST:ip}`<br />출력: `{"ip": "2001:db8:3333:4444:5555:6666:7777:8888"}` | 
| SYSLOGFACILITY | 십진수 형식의 syslog 우선 순위와 일치합니다. 값은 각진 대괄호(<>)로 묶어야 합니다. | 20 | 입력: `<13.6>`<br />패턴: `%{SYSLOGFACILITY:syslog}`<br />출력: `{"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)
```

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