

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 可設定的剖析器類型處理器
<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：使用 grok 搭配 parseJSON 從 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`內容不會變更，新的金鑰會新增至訊息。


| 欄位 | Description | 是否為必要？ | 預設 | 限制 | 
| --- | --- | --- | --- | --- | 
|  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 處理器來剖析和建構使用模式比對的非結構化資料。此處理器也可以從日誌訊息中擷取欄位。


| 欄位 | Description | 是否為必要？ | 預設 | 限制 | 備註 | 
| --- | --- | --- | --- | --- | --- | 
|  source | 在 上套用 Grok 比對的欄位路徑 |  否 | `@message`  | 長度上限：128 巢狀金鑰深度上限：3 | 
|  match | 要比對日誌事件的 grok 模式  |  是 |  | 長度上限：512 grok 模式上限：20 某些 grok 模式類型具有個別用量限制。下列模式的任意組合最多可以使用五次：\$1URI， URIPARAM， URIPATHPARAM， SPACE， DATA， GREEDYDATA， GREEDYDATA\$1MULTILINE\$1 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：使用 grok 搭配 parseJSON 從 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 模式 | Description | 模式上限 | 範例 | 
| --- | --- | --- | --- | 
| USERNAME 或 USER | 符合一個或多個字元，可包含小寫字母 (a-z)、大寫字母 (A-Z)、數字 (0-9)、點 (.)、底線 (\$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 | 將小數和十六進位數字與選用的符號 (\$1 或 -) 和選用的 0x 字首配對 | 20 |  輸入： `+0xA1B2` 模式：`%{BASE16NUM:num}` 輸出： `{"num": "+0xA1B2"}`  | 
| POSINT | 比對沒有前導零的完整正整數，包含一或多個數字 (1-9 後接 0-9) | 20 |  輸入： `123` 模式：`%{POSINT:num}` 輸出： `{"num": "123"}`  | 
| NONNEGINT | 符合任何整數 （包含一或多個數字 0-9)，包括零和開頭為零的數字。 | 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 | 符合零個或多個空格字元。 | 5 |  輸入： `" "` 模式：`%{SPACE:extra}` 輸出： `{"extra": " "}`  | 
| DATA | 符合任何字元 （新行除外） 零次或多次，非貪婪。 | 5 |  輸入： `abc def ghi` 模式：`%{DATA:x} %{DATA:y}` 輸出： `{"x": "abc", "y": "def ghi"}`  | 
| GREEDYDATA | 符合任何字元 （新行除外） 零次或多次，歡迎。 | 5 |  輸入： `abc def ghi` 模式：`%{GREEDYDATA:x} %{GREEDYDATA:y}` 輸出： `{"x": "abc def", "y": "ghi"}`  | 
| GREEDYDATA\$1MULTILINE | 符合任何角色 （包括換行） 零次或多次，歡迎。 | 1 |  輸入: `abc` `def` `ghi` 模式：`%{GREEDYDATA_MULTILINE:data}` 輸出： `{"data": "abc\ndef\nghi"}`  | 
| QUOTEDSTRING | 將引號字串 （單引號或雙引號） 與逸出字元相符。 | 20 |  輸入： `"Hello, world!"` 模式：`%{QUOTEDSTRING:msg}` 輸出： `{"msg": "Hello, world!"}`  | 
| UUID | 符合標準 UUID 格式：8 個十六進位字元，後面接著三個 4 個十六進位字元群組，並以 12 個十六進位字元結尾，全部以連字號分隔。 | 20 |  輸入： `550e8400-e29b-41d4-a716-446655440000` 模式：`%{UUID:id}` 輸出： `{"id": "550e8400-e29b-41d4-a716-446655440000"}`  | 
| URN | 符合 URN （統一資源名稱） 語法。 | 20 |  輸入： `urn:isbn:0451450523` 模式：`%{URN:urn}` 輸出： `{"urn": "urn:isbn:0451450523"}`  | 

**AWS grok 模式**


| 模式 | Description | 模式上限 | 範例 | 
| --- | --- | --- | --- | 
|  ARN  |  符合 AWS Amazon Resource Name (ARNs)`aws-cn`、擷取分割區 (`aws`、 或 `aws-us-gov`)、服務、區域、帳戶 ID，以及最多 5 個以斜線分隔的階層資源識別符。它將不符合冒號之間缺少資訊的 ARNs。  | 5 |  輸入： `arn:aws:iam:us-east-1:123456789012:user/johndoe` 模式：`%{ARN:arn}` 輸出： `{"arn": "arn:aws:iam:us-east-1:123456789012:user/johndoe"}`  | 

**網路 grok 模式**


| Grok 模式 | Description | 模式上限 | 範例 | 
| --- | --- | --- | --- | 
| CISCOMAC | 符合 4-4-4 十六進位格式的 MAC 地址。 | 20 |  輸入： `0123.4567.89AB` 模式：`%{CISCOMAC:MacAddress}` 輸出： `{"MacAddress": "0123.4567.89AB"}`  | 
| WINDOWSMAC | 將十六進位格式的 MAC 地址與連字號相符 | 20 |  輸入： `01-23-45-67-89-AB` 模式：`%{WINDOWSMAC:MacAddress}` 輸出： `{"MacAddress": "01-23-45-67-89-AB"}`  | 
| COMMONMAC | 比對十六進位格式的 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 | 符合 IPv6 地址，包括壓縮表單和 IPv4-mapped 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 | 符合 %\$1IPvIPv6\$1 支援的 IPv6 地址或 %\$1IPv4\$1 支援的 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 | 符合 %\$1IPORHOST\$1 模式支援的 IP 地址或主機名稱，後面接著冒號和連接埠號碼，在輸出中擷取連接埠做為「PORT」。 | 5 |  輸入： `192.168.1.1:8080` 模式：`%{HOSTPORT:ip}` 輸出： `{"ip":"192.168.1.1:8080","PORT":"8080"}`  | 
| URIHOST | 符合 %\$1IPORHOST\$1 模式支援的 IP 地址或主機名稱，選擇性地後面接著冒號和連接埠號碼，如果有的話，擷取連接埠為「連接埠」。 | 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 模式 | Description | 模式上限 | 範例 | 
| --- | --- | --- | --- | 
| 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 模式 | Description | 模式上限 | 範例 | 
| --- | --- | --- | --- | 
| MONTH | 將完整或縮寫的英文月份名稱配對為完整單字 | 20 |  輸入： `Jan` 模式：`%{MONTH:month}` 輸出： `{"month":"Jan"}` 輸入： `January` 模式：`%{MONTH:month}` 輸出： `{"month":"January"}`  | 
| MONTHNUM | 比對從 1 到 12 的月份編號，單位數月份的選用前導零。 | 20 |  輸入： `5` 模式：`%{MONTHNUM:month}` 輸出： `{"month":"5"}` 輸入： `05` 模式：`%{MONTHNUM:month}` 輸出： `{"month":"05"}`  | 
| MONTHNUM2 | 符合從 01 到 12 的兩位數月編號。 | 20 |  輸入： `05` 模式：`%{MONTHNUM2:month}` 輸出： `{"month":"05"}`  | 
| 週一 | 將月份中的某天從 1 比對到 31，加上選用的前導零。 | 20 |  輸入： `31` 模式：`%{MONTHDAY:monthDay}` 輸出： `{"monthDay":"31"}`  | 
| YEAR | 符合兩或四位數的年份 | 20 |  輸入： `2024` 模式：`%{YEAR:year}` 輸出： `{"year":"2024"}` 輸入： `24` 模式：`%{YEAR:year}` 輸出： `{"year":"24"}`  | 
| DAY | 符合完整或縮寫的日名稱。 | 20 |  輸入： `Tuesday` 模式：`%{DAY:day}` 輸出： `{"day":"Tuesday"}`  | 
| HOUR | 將 24 小時格式的小時與選用的前導零 (0)0-23 配對。 | 20 |  輸入： `22` 模式：`%{HOUR:hour}` 輸出： `{"hour":"22"}`  | 
| MINUTE | 符合分鐘數 (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) 比對時間格式。秒包括閏秒 (0)0-60。 | 20 |  輸入： `09:45:32` 模式：`%{TIME:time}` 輸出： `{"time":"09:45:32"}`  | 
| DATE\$1US | 符合 (M)M/(d)d/(yy)y 或 (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-60 的數字，選擇性地後接小數點或冒號，以及小數秒的一個或多個數字 | 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 比對歐洲格式的日期 | 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 時區 | 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 | 符合 RFC2822 日期時間格式：Day， (d)d MonthName (yy)yy (H)H：mm：(s)s Z\$1【\$1-】(H)H：mm | 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 模式 | Description | 模式上限 | 範例 | 
| --- | --- | --- | --- | 
| LOGLEVEL | 符合不同大寫和縮寫中的標準日誌層級，包括下列項目：Alert/ALERT、Trace/TRACE、Debug/DEBUG、Notice/NOTICEInfo/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 時區 MonthName： 符合完整或縮寫的英文月份名稱 （範例：「Jan」或「January」) 時區： 符合 %\$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 相符的日期格式：符合完整或縮寫的英文月份名稱 （範例：「1 月」或「1 月」) | 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) 日誌格式。當您使用這些特定模式時，它們必須是相符組態中的第一個模式，而且前面沒有其他模式。此外，您只能使用一個 **DATA** 來追蹤它們。**GREEDYDATA** 或 **GREEDYDATA\$1MULTILINE** 模式。


| Grok 模式 | Description | 模式上限 | 
| --- | --- | --- | 
|  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) 從日誌事件剖析為資料欄。


| 欄位 | Description | 是否為必要？ | 預設 | 限制 | 
| --- | --- | --- | --- | --- | 
|  source | 要剖析之日誌事件中 欄位的路徑 |  否 | `@message`  | 長度上限：128 巢狀金鑰深度上限：3 | 
|  分隔符號 | 用來分隔原始逗號分隔值日誌事件中每個資料欄的字元 |  否 | `,`  | 長度上限：1，除非值為 `\t`或 `\s`  | 
|  quoteCharacter | 用作單一資料欄文字限定詞的字元 |  否 | `"`  | 長度上限：1  | 
|  欄 | 要用於轉換日誌事件中資料欄的名稱清單。 |  否 | `[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** 處理器將指定的欄位剖析為鍵/值對。您可以使用下列選項自訂處理器來剖析欄位資訊。


| 欄位 | Description | 是否為必要？ | 預設 | 限制 | 
| --- | --- | --- | --- | --- | 
|  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"
  }
}
```