可設定的剖析器類型處理器 - 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}

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:使用 grok 搭配 parseJSON 從 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 模式 描述 模式上限 範例
USERNAME 或 USER 符合一個或多個字元,可包含小寫字母 (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 將小數和十六進位數字與選用的符號 (+ 或 -) 和選用的 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 比對由一或多個單字字元 (\w) 組成的完整單字,包括字母、數字和底線 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_MULTILINE 符合任何角色 (包括換行) 零次或多次,歡迎。 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 模式

模式 描述 模式上限 範例

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 模式 描述 模式上限 範例
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 符合 %{IPvIPv6} 支援的 IPv6 地址或 %{IPv4} 支援的 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 地址或主機名稱,選擇性地後面接著冒號和連接埠號碼,如果有的話,請將連接埠擷取為「連接埠」。 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 的月份編號,單位數月份的選用前導零。 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_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 使用 %{DATE_US} 比對美國格式的日期,或使用 %{DATE_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 時區 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 符合 RFC2822 日期時間格式:Day, (d)d MonthName (yy)yy (H)H:mm:(s)s Z|【+-】(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_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/ALERTTrace/TRACEDebug/DEBUGNotice/NOTICEInfo/INFOWarn/Warning/WARN/WARNINGErr/Error/ERR/ERRORCrit/Critical/CRIT/CRITICALFatal/FATALSevere/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」) 時區: 符合 %{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 的日期格式:符合完整或縮寫的英文月份名稱 (範例:「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 符合 %{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) 日誌格式。當您使用這些特定模式時,它們必須是相符組態中的第一個模式,而且前面沒有其他模式。此外,您只能使用一個 DATA 來追蹤它們。GREEDYDATAGREEDYDATA_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

分隔符號

用來分隔原始逗號分隔值日誌事件中每個資料欄的字元

,

長度上限:1,除非值為 \t\s

quoteCharacter

用作單一資料欄文字限定詞的字元

"

長度上限:1

要用於轉換日誌事件中資料欄的名稱清單。

[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" } }