你可以使用的处理器 - Amazon CloudWatch 日志
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

你可以使用的处理器

本节包含有关可以在日志事件转换器中使用的每个处理器的信息。处理器可以分为解析器、字符串变异器、JSON 变异器和日期处理器。

可配置的解析器类型处理器

parseJSON

parseJSON 处理器解析 JSON 日志事件,并在目标下插入提取的 JSON 键值对。如果您未指定目的地,则处理器会将键值对放在根节点下。

原始@message内容未更改,新密钥已添加到消息中。

字段 描述 必填? 默认 限制

日志事件中要解析的字段的路径。使用点符号访问子字段。例如,store.book

@message

最大长度:128

最大嵌套密钥深度:3

destination

解析后的 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 处理器使用模式匹配来解析和构造非结构化数据。该处理器还可以从日志消息中提取字段。

字段 描述 必填? 默认 限制

日志事件中要应用 grok 匹配的字段的路径

@message

最大长度:128

最大嵌套密钥深度:3

match

要与日志事件匹配的 grok 模式。本节末尾列出了支持的 grok 模式。

最大长度:128

最多 5 个 grok 模式。grok 模式不支持类型转换。

对于常见的日志格式模式(APACHE_ACCESS_LOG、NGINX_ACCESS_LOG、 SYSLOG5424、),仅支持在常见日志模式之后包含 GREEDYDATA 或 DATA 模式。

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" }
示例 2

示例日志:

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" }
示例 3:将 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" }

支持的 grok 模式

下表列出了grok处理器支持的模式。

一般 grok 模式

模式 示例 描述

用户名或用户

输入:user123.name-TEST

模式:%{USERNAME:name}

输出:{"name": "user123.name-TEST"}

匹配一个或多个字符,这些字符可以包含小写字母 (a-z)、大写字母 (A-Z)、数字 (0-9)、点 (.)、下划线 (_) 或连字符 (-)

INT

输入:-456

模式:%{INT:num}

输出:{"num": "-456"}

匹配后跟一个或多个数字的可选加号或减号。

BASE10NUM

输入:-0.67

模式:%{BASE10NUM:num}

输出:{"num": "-0.67"}

匹配带有可选符号和小数点的整数或浮点数。

BASE16NUM

输入:+0xA1B2

模式:%{BASE16NUM:num}

输出:{"num": "+0xA1B2"}

匹配带有可选符号(+ 或-)和可选的 0x 前缀的十进制和十六进制数字。

姿势

输入:123

模式:%{POSINT:num}

输出:{"num": "123"}

匹配不带前导零的整数,由一个或多个数字(1-9 后跟 0-9)组成。

NONNEGINT

输入:008

模式:%{NONNEGINT:num}

输出:{"num": "008"}

匹配任何整数(由一个或多个数字 0-9 组成),包括零和带前导零的数字。

单词

输入:user_123

模式:%{WORD:user}

输出:{"user": "user_123"}

匹配由一个或多个单词字符 (\ w) 组成的完整单词,包括字母、数字和下划线。

不是空格

输入:hello_world123

模式:%{NOTSPACE:msg}

输出:{"msg": "hello_world123"}

匹配一个或多个非空格字符。

SPACE

输入:" "

模式:%{SPACE:extra}

输出:{"extra": " "}

匹配零个或多个空格字符。

DATA

输入:abc def

模式:%{DATA:data}

输出:{"data": "abc def"}

匹配任何字符(换行符除外)零次或多次,不贪婪。

GREEDYDATA

输入:abc def

模式:%{GREEDYDATA:data}

输出:{"data": "abc def"}

匹配任何字符(换行符除外)零次或多次,贪婪。

带引号的字符串

输入:"Hello, world!"

模式:%{QUOTEDSTRING:msg}

输出:{"msg": "Hello, world!"}

将带引号的字符串(单引号或双引号)与转义字符匹配。

UUID

输入:550e8400-e29b-41d4-a716-446655440000

模式:%{UUID:id}

输出:{"id": "550e8400-e29b-41d4-a716-446655440000"}

匹配标准 UUID 格式:8 个十六进制字符,后跟三组 4 个十六进制字符,以 12 个十六进制字符结尾,全部用连字符分隔。

骨灰盒

输入:urn:isbn:0451450523

模式:%{URN:urn}

输出:{"urn": "urn:isbn:0451450523"}

匹配统一资源名称 (URN) 语法。

Amazon Grok 图案

模式 示例 描述

ARN

输入:arn:aws:iam:us-east-1:123456789012:user/johndoe

模式:%{ARN:arn}

输出:{"arn": "arn:aws:iam:us-east-1:123456789012:user/johndoe"}

匹配 Amazon Amazon 资源名称 (ARNs),捕获分区(awsaws-cn、或aws-us-gov)、服务、区域、账户 ID 以及最多 5 个由斜杠分隔的分层资源标识符。它与冒号之间缺少 ARNs 的信息不匹配。

联网 grok 模式

模式 示例 描述

CISCOMAC

输入:0123.4567.89AB

模式:%{CISCOMAC:MacAddress}

输出:{"MacAddress": "0123.4567.89AB"}

匹配 4-4-4 十六进制格式的 MAC 地址。

WINDOWSMAC

输入:01-23-45-67-89-AB

模式:%{WINDOWSMAC:MacAddress}

输出:{"MacAddress": "01-23-45-67-89-AB"}

将十六进制格式的 MAC 地址与连字符进行匹配。

COMMONMA

输入:01:23:45:67:89:AB

模式:%{COMMONMAC:MacAddress}

输出:{"MacAddress": "01:23:45:67:89:AB"}

将十六进制格式的 MAC 地址与冒号进行匹配。

MAC

输入:01:23:45:67:89:AB

模式:%{MAC:m1}

输出:{"m1": "01:23:45:67:89:AB"}

匹配任何 CISCOMAC、WINDOWSMAC 或 CO MMONMAC 模式。

IPV6

输入:2001:db8:3333:4444:5555:6666:7777:8888

模式:%{IPV6:ip}

输出:{"ip": "2001:db8:3333:4444:5555:6666:7777:8888"}

匹配 IPv6 地址,包括压缩表单和 IPv4映射 IPv6 地址。

IPV4

输入:192.168.0.1

模式:%{IPV4:ip}

输出:{"ip": "192.168.0.1"}

匹配 IPv4 地址。

IP

输入:192.168.0.1

模式:%{IP:ip}

输出:{"ip": "192.168.0.1"}

匹配模式支持 IPv6 的地 IPv4 址或IPV6模式支持的地IPV4址。

主机名或主机

输入:server-01.internal-network.local

模式:%{HOST:host}

输出:{"host": "server-01.internal-network.local"}

匹配域名,包括子域名。

IPORHOST

输入:2001:db8:3333:4444:5555:6666:7777:8888

模式:%{IPORHOST:ip}

输出:{"ip": "2001:db8:3333:4444:5555:6666:7777:8888"}

匹配主机名模式中支持的主机名或 IP 模式支持的 IP 地址。

主机端口

输入:192.168.0.1:8080

模式:%{HOSTPORT:ip}

输出:{"ip":"192.168.0.1:8080","PORT":"8080"}

匹配 IPORH OST 模式支持的 IP 地址或主机名,后跟冒号和端口号,在输出中将该端口捕获为 “端口”。

URIHOST

输入:example.com:443 10.0.0.1

模式:%{URIHOST:host} %{URIHOST:ip}

输出:{"host":"example.com:443","port":"443","ip":"10.0.0.1"}

匹配 IPORH OST 模式支持的 IP 地址或主机名,后面可以选择冒号和端口号,将该端口捕获为 “端口”(如果存在)。

Path grok 模式

模式 示例 描述

UNIXPATH

输入:/search?q=regex

模式:%{UNIXPATH:path}

输出:{"path":"/search?q=regex"}

匹配 URL 路径,可能包括查询参数。

WINPATH

输入:C:\Users\John\Documents\file.txt

模式:%{WINPATH:path}

输出:{"path": "C:\\Users\\John\\Documents\\file.txt"}

匹配 Windows 文件路径。

路径

输入:/search?q=regex

模式:%{PATH:path}

输出:{"path":"/search?q=regex"}

匹配 URL 或 Windows 文件路径。

TTY

输入:/dev/tty1

模式:%{TTY:path}

输出:{"path":"/dev/tty1"}

匹配终端和伪终端的 Unix 设备路径。

URIPROTO

输入:web+transformer

模式:%{URIPROTO:protocol}

输出:{"protocol":"web+transformer"}

匹配字母,后面可选加号 (+) 字符和其他字母或加号 (+) 字符。

URIPATH

输入:/category/sub-category/product_name

模式:%{URIPATH:path}

输出:{"path":"/category/sub-category/product_name"}

匹配 URI 的路径部分。

URIPARAM

输入:?param1=value1&param2=value2

模式:%{URIPARAM:url}

输出:{"url":"?param1=value1&param2=value2"}

匹配网址查询参数。

URIPATHPARAM

输入:/category/sub-category/product?id=12345&color=red

模式:%{URIPATHPARAM:path}

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

匹配 URI 路径(可选),后面有查询参数。

URI

输入: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"}

匹配完整的 URI。

日期和时间 grok 模式

模式 示例 描述

MONTH

输入:Jan

模式:%{MONTH:month}

输出:{"month":"Jan"}

输入:January

模式:%{MONTH:month}

输出:{"month":"January"}

将英文中完整或缩写的月份名称作为全词匹配。

MONTHNUM

输入:5

模式:%{MONTHNUM:month}

输出:{"month":"5"}

输入:05

模式:%{MONTHNUM:month}

输出:{"month":"05"}

匹配从 1 到 12 的月份数字,对于个位数月份,可选前导零。

MONTHNUM2

输入:05

模式:%{MONTHNUM2:month}

输出:{"month":"05"}

匹配从 01 到 12 的两位数月份数字。

月日

输入:31

模式:%{MONTHDAY:monthDay}

输出:{"monthDay":"31"}

匹配从 1 到 31 的月份中的某一天,可选前导零。

YEAR

输入:2024

模式:%{YEAR:year}

输出:{"year":"2024"}

输入:24

模式:%{YEAR:year}

输出:{"year":"24"}

以两位或四位数的格式匹配年份。

DAY

输入:Tuesday

模式:%{DAY:day}

输出:{"day":"Tuesday"}

匹配完整或缩写的日期名称。

HOUR

输入:22

模式:%{HOUR:hour}

输出:{"hour":"22"}

以 24 小时格式匹配小时,可选的前导零 (0) 0-23。

MINUTE

输入:59

模式:%{MINUTE:min}

输出:{"min":"59"}

匹配分钟 (00-59)。

SECOND

输入:3

模式:%{SECOND:second}

输出:{"second":"3"}

输入:30.5

模式:%{SECOND:fractionalSeconds}

输出:{"minSec":"30.5"}

输入:30:5

模式:%{SECOND:fractionalSeconds}

输出:{"minSec":"30:5"}

匹配代表秒 (0) 0-60 的数字,可选后跟小数点或冒号,以及小数秒的一位或多位数字。

TIME

输入:09:45:32

模式:%{TIME:time}

输出:{"time":"09:45:32"}

将带有小时、分钟和秒的时间格式进行匹配,其中小时模式与小时匹配,分钟模式与分钟匹配,第二模式与秒模式匹配,通常采用该格式(H)H:mm:(s)s。秒包括闰秒 (0) 0-60。

DATE_US

输入:11/23/2024

模式:%{DATE_US:date}

输出:{"date":"11/23/2024"}

输入:1-01-24

模式:%{DATE_US:date}

输出:{"date":"1-01-24"}

匹配(M)M/(d)d/(yy)yy或格式的日期(M)M-(d)d-(yy)yy,其中 MONTH NUM 模式与月份匹配,MONTHDA Y 模式匹配日期,YEAR 模式与份匹配。

DATE_EU

输入:23/11/2024

模式:%{DATE_EU:date}

输出:{"date":"23/11/2024"}

输入:1-01-24

模式:%{DATE_EU:date}

输出:{"date":"1.01.24"}

以、或的格式匹配日期 d)d/(M)M/(yy)yy (d)d-(M)M-(yy)yy(d)d.(M)M.(yy)yy,其中 MONTH NUM 模式与月份匹配,MONTHDAY 模式与日期匹配,YEAR 模式与份匹配。

DATE

输入:11/29/2024

模式:%{DATE:date}

输出:{"date":"11/29/2024"}

输入:29.11.2024

模式:%{DATE:date}

输出:{"date":"29.11.2024"}

匹配美国格式或欧洲格式的日期,例如 DATE_U S 和 DATE_E U 模式。

日期戳

输入:29-11-2024 14:30:00

模式:%{DATESTAMP:dateTime}

输出:{"dateTime":"29-11-2024 14:30:00"}

匹配日期模式后跟时间模式,用空格或连字符分隔。

TZ

输入:PDT

模式:%{TZ:tz}

输出:{"tz":"PDT"}

匹配常见的时区缩写(太平洋标准时间、太平洋夏令时、MST、MDT、CST CDT、EST、EDT、UTC)。

ISO8601_timeZONE

输入:+05:30

模式:%{ISO8601_TIMEZONE:tz}

输出:{"tz":"+05:30"}

输入:-530

模式:%{ISO8601_TIMEZONE:tz}

输出:{"tz":"-530"}

输入:Z

模式:%{ISO8601_TIMEZONE:tz}

输出:{"tz":"Z"}

将 UTC 偏移量 “Z” 或时区偏移量与以下格式的可选冒号匹配:[+-](H)H(:)mmw 这里的 HOUR 模式与小时匹配,MINUTE 模式与分钟匹配。

ISO8601_SECOND

输入:60

模式:%{ISO8601_SECOND:second}

输出:{"second":"60"}

匹配代表秒 (0) 0-60 的数字,可选后跟小数点或冒号,以及小数秒的一位或多位数字。

时间戳_ 01 ISO86

输入: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"}

将 ISO86 01 日期时间格式(yy)yy-(M)M-(d)dT(H)H:mm:((s)s)(Z|[+-](H)H:mm)与可选秒数和时区相匹配。

日期戳_ RFC2822

输入: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:timestamp}

输出:{"dateTime":"Monday, 15 Jan 23 14:30:00 Z"}

匹配 RFC2822 日期时间格式:Day, (d)d MonthName (yy)yy (H)H:mm:(s)s Z|[+-](H)H:mm

Day模式用于匹配完整日期或缩写日期,例如 “星期一” 或 “星期一”。 MonthNamepattern 用于匹配完整或缩写的英文月份名称,例如 “Jan” 或 “January”。 Timezonepattern 用于将 UTC 偏移量 (Z) 或时区偏移量与可选冒号进行匹配。

DATESTAMP_其他

输入:Mon May 15 14:30:00 PST 2023

模式:%{DATESTAMP_OTHER:dateTime}

输出:{"dateTime":"Mon May 15 14:30:00 PST 2023"}

按以下格式匹配日期和时间:Day MonthName (d)d (H)H:mm:(s)s Timezone (yy)yy

Da y 模式用于匹配完整日期或缩写日期,例如 “星期一” 或 “星期一”。该MonthName模式用于匹配完整或缩写的英文月份名称,例如 “Jan” 或 “January”。 Day模式用于匹配完整日期或缩写日期,例如 “星期一” 或 “星期一”。 MonthNamepattern 用于匹配完整或缩写的英文月份名称,例如 “Jan” 或 “January”。 Timezone模式匹配 TZ grok 模式支持的任何时区。

DATESTAMP_EVENTLOG

输入:20230515143000

模式:%{DATESTAMP_EVENTLOG:dateTime}

输出:{"dateTime":"20230515143000"}

匹配不带分隔符的紧凑日期时间格式:(yy)yyMM(d)d(H)Hmm(s)s

Log grok 模式

模式 示例 描述

日志级别

输入:INFO

模式:%{LOGLEVEL:logLevel}

输出:{"logLevel":"INFO"}

匹配使用不同大写和缩写的标准日志级别,包括以下内容:、Alert/ALERT、、、Trace/TRACE、、Debug/DEBUGNotice/NOTICEInfo/INFOWarn/Warning/WARN/WARNING、、Err/Error/ERR/ERRORCrit/Critical/CRIT/CRITICALFatal/FATALSevere/SEVERE Emerg/Emergency/EMERG/EMERGENCY

HTTPDATE

输入:23/Nov/2024:14:30:00 +0640

模式:%{HTTPDATE:date}

输出:{"date":"23/Nov/2024:14:30:00 +0640"}

匹配日志文件中经常使用的日期和时间格式。格式:(d)d/MonthName/(yy)yy:(H)H:mm:(s)s Timezone

MonthName匹配完整或缩写的英文月份名称,例如 “Jan” 或 “January”,并Timezone匹配 INT grok 模式。

系统日志时间戳

输入:Nov 29 14:30:00

模式:%{SYSLOGTIMESTAMP:dateTime}

输出:{"dateTime":"Nov 29 14:30:00"}

将日期格式与匹配MonthName (d)d (H)H:mm:(s)s

MonthName匹配完整或缩写的英文月份名称,例如 “Jan” 或 “January”

PROG

输入:user.profile/settings-page

模式:%{PROG:program}

输出:{"program":"user.profile/settings-page"}

匹配由字母、数字、点、下划线、正斜杠、百分号和连字符组成的程序名称。

SYSLOGPROG

输入:user.profile/settings-page[1234]

模式:%{SYSLOGPROG:programWithId}

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

匹配 PROG g rok 模式(可选),后面加上方括号中的进程 ID。

SYSLOGH

输入:2001:db8:3333:4444:5555:6666:7777:8888

模式:%{SYSLOGHOST:ip}

输出:{"ip": "2001:db8:3333:4444:5555:6666:7777:8888"}

匹配主机IP 模式。

系统日志工具

输入:<13.6>

模式:%{SYSLOGFACILITY:syslog}

输出:{"syslog":"<13.6>","facility":"13","priority":"6"}

匹配十进制格式的 syslog 优先级。该值应用尖括号 (<>) 括起来。

常见的 log grok 模式

你可以使用预定义的自定义 grok 模式来匹配 Apache、NGINX 和 Syslog 协议 (RFC 5424) 日志格式。当你使用这些特定的模式时,它们必须是匹配配置中的第一个模式,并且没有其他模式可以排在它们之前。此外,你只能使用 GREEDYDATA 或 DAT A 模式关注它们。

模式 描述 match字段内的使用限制

APACHE_ACCESS_LOG

匹配 Apache 访问日志

1

NGINX_ACCESS_LOG

匹配 NGINX 访问日志

1

SYSLOG5424

匹配系统日志协议 (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}" } } ]

输出:

{ "remote_host": "127.0.0.1", "ident": "-", "auth_user": "-", "timestamp": "2023-08-03T12:34:56Z", "http_method": "GET", "request": "/page.html", "http_version": 1.1, "status_code": 200, "response_size": 1234 }
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}" } } ]

输出:

{ "remote_host": "192.168.1.100", "ident": "-", "auth_user": "Foo", "timestamp": "2023-08-03T12:34:56Z", "http_method": "GET", "request": "/account/login.html", "http_version": 1.1, "status_code": 200, "response_size": 42, "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" }
系统日志协议 (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) 解析为列。

字段 描述 必填? 默认 限制

日志事件中要解析的字段的路径

@message

最大长度:128

最大嵌套密钥深度:3

分隔符

用于分隔原始逗号分隔值日志事件中每列的字符

,

最大长度:1

QuoteCharacter

用作单列数据的文本限定符的字符

"

最大长度:1

用于转换后的日志事件中各列的名称列表。

[column_1, column_2 ...]

最多 CSV 列数:100

最大长度:128

最大嵌套密钥深度:3

示例

假设摄取的日志事件的一部分如下所示:

'Akua Mansa',28,'New York, USA'

假设我们只使用 csv 处理器:

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

转换后的日志事件将如下所示。

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

parseKeyValue

使用parseKeyValue处理器将指定字段解析为键值对。您可以使用以下选项自定义处理器以解析字段信息。

字段 描述 必填? 默认 限制

日志事件中要解析的字段的路径

@message

最大长度:128

最大嵌套密钥深度:3

destination

要将提取的键值对放入的目标字段

最大长度:128

字段分隔符

在原始日志事件的键值对之间使用的字段分隔符字符串

&

最大长度: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" } }

用于 Amazon 出售日志的内置处理器

parseWaf

使用此处理器来解析 Amazon WAF 出售的日志,它获取每个标头名称的内容httpRequest.headers并使用相应的值创建 JSON 密钥。它的作用也是一样的labels。这些转换可以使查询 Amazon WAF 日志变得更加容易。有关 Amazon WAF 日志格式的更多信息,请参阅 Web ACL 流量的日志示例

此处理器仅接受@message作为输入。

重要

如果您使用此处理器,则它必须是变压器中的第一个处理器。

示例

以下面的日志事件为例:

{ "timestamp": 1576280412771, "formatVersion": 1, "webaclId": "arn:aws:wafv2:ap-southeast-2:111122223333:regional/webacl/STMTest/1EXAMPLE-2ARN-3ARN-4ARN-123456EXAMPLE", "terminatingRuleId": "STMTest_SQLi_XSS", "terminatingRuleType": "REGULAR", "action": "BLOCK", "terminatingRuleMatchDetails": [ { "conditionType": "SQL_INJECTION", "sensitivityLevel": "HIGH", "location": "HEADER", "matchedData": ["10", "AND", "1"] } ], "httpSourceName": "-", "httpSourceId": "-", "ruleGroupList": [], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [], "httpRequest": { "clientIp": "1.1.1.1", "country": "AU", "headers": [ { "name": "Host", "value": "localhost:1989" }, { "name": "User-Agent", "value": "curl/7.61.1" }, { "name": "Accept", "value": "*/*" }, { "name": "x-stm-test", "value": "10 AND 1=1" } ], "uri": "/myUri", "args": "", "httpVersion": "HTTP/1.1", "httpMethod": "GET", "requestId": "rid" }, "labels": [{ "name": "value" }] }

处理器配置是这样的:

[ "parseWAF": {} ]

转换后的日志事件将如下所示。

{ "httpRequest": { "headers": { "Host": "localhost:1989", "User-Agent": "curl/7.61.1", "Accept": "*/*", "x-stm-test": "10 AND 1=1" }, "clientIp": "1.1.1.1", "country": "AU", "uri": "/myUri", "args": "", "httpVersion": "HTTP/1.1", "httpMethod": "GET", "requestId": "rid" }, "labels": { "name": "value" }, "timestamp": 1576280412771, "formatVersion": 1, "webaclId": "arn:aws:wafv2:ap-southeast-2:111122223333:regional/webacl/STMTest/1EXAMPLE-2ARN-3ARN-4ARN-123456EXAMPLE", "terminatingRuleId": "STMTest_SQLi_XSS", "terminatingRuleType": "REGULAR", "action": "BLOCK", "terminatingRuleMatchDetails": [ { "conditionType": "SQL_INJECTION", "sensitivityLevel": "HIGH", "location": "HEADER", "matchedData": ["10", "AND", "1"] } ], "httpSourceName": "-", "httpSourceId": "-", "ruleGroupList": [], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [] }

parsePostgres

使用此处理器来解析 Amazon RDS for PostgreSQL 出售的日志、提取字段并将其转换为 JSON 格式。有关适用于 PostgreSQL 的 RDS 日志格式的更多信息,请参阅适用于 PostgreSQL 的 RDS 数据库日志文件

此处理器仅接受@message作为输入。

重要

如果您使用此处理器,则它必须是变压器中的第一个处理器。

示例

以下面的日志事件为例:

2019-03-10 03:54:59 UTC:10.0.0.123(52834):postgres@logtestdb:[20175]:ERROR: column "wrong_column_name" does not exist at character 8

处理器配置是这样的:

[ "parsePostgres": {} ]

转换后的日志事件将如下所示。

{ "logTime": "2019-03-10 03:54:59 UTC", "srcIp": "10.0.0.123(52834)", "userName": "postgres", "dbName": "logtestdb", "processId": "20175", "logLevel": "ERROR" }

parsecLoudFront

使用此处理器来解析 Amazon CloudFront 出售的日志、提取字段并将其转换为 JSON 格式。对编码后的字段值进行解码。整数和双精度数的值被视为整数和双精度数。有关 Amazon CloudFront 日志格式的更多信息,请参阅配置和使用标准日志(访问日志)

此处理器仅接受@message作为输入。

重要

如果您使用此处理器,则它必须是变压器中的第一个处理器。

示例

以下面的日志事件为例:

2019-12-04 21:02:31 LAX1 392 192.0.2.24 GET d111111abcdef8.cloudfront.net /index.html 200 - Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36 - - Hit SOX4xwn4XV6Q4rgb7XiVGOHms_BGlTAC4KyHmureZmBNrjGdRLiNIQ== d111111abcdef8.cloudfront.net https 23 0.001 - TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 Hit HTTP/2.0 - - 11040 0.001 Hit text/html 78 - -

处理器配置是这样的:

[ "parseCloudfront": {} ]

转换后的日志事件将如下所示。

{ "date": "2019-12-04", "time": "21:02:31", "x-edge-location": "LAX1", "sc-bytes": 392, "c-ip": "192.0.2.24", "cs-method": "GET", "cs(Host)": "d111111abcdef8.cloudfront.net", "cs-uri-stem": "/index.html", "sc-status": 200, "cs(Referer)": "-", "cs(User-Agent)": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36", "cs-uri-query": "-", "cs(Cookie)": "-", "x-edge-result-type": "Hit", "x-edge-request-id": "SOX4xwn4XV6Q4rgb7XiVGOHms_BGlTAC4KyHmureZmBNrjGdRLiNIQ==", "x-host-header": "d111111abcdef8.cloudfront.net", "cs-protocol": "https", "cs-bytes": 23, "time-taken": 0.001, "x-forwarded-for": "-", "ssl-protocol": "TLSv1.2", "ssl-cipher": "ECDHE-RSA-AES128-GCM-SHA256", "x-edge-response-result-type": "Hit", "cs-protocol-version": "HTTP/2.0", "fle-status": "-", "fle-encrypted-fields": "-", "c-port": 11040, "time-to-first-byte": 0.001, "x-edge-detailed-result-type": "Hit", "sc-content-type": "text/html", "sc-content-len": 78, "sc-range-start": "-", "sc-range-end": "-" }

parseRoute53

使用此处理器来解析 Amazon Route 53 Public Data Plane 出售的日志、提取字段并将其转换为 JSON 格式。对编码后的字段值进行解码。

此处理器仅接受@message作为输入。

重要

如果您使用此处理器,则它必须是变压器中的第一个处理器。

示例

以下面的日志事件为例:

1.0 2017-12-13T08:15:50.235Z Z123412341234 example.com AAAA NOERROR TCP IAD12 192.0.2.0 198.51.100.0/24

处理器配置是这样的:

[ "parseRoute53": {} ]

转换后的日志事件将如下所示。

{ "version": 1.0, "queryTimestamp": "2017-12-13T08:15:50.235Z", "hostZoneId": "Z123412341234", "queryName": "example.com", "queryType": "AAAA", "responseCode": "NOERROR", "protocol": "TCP", "edgeLocation": "IAD12", "resolverIp": "192.0.2.0", "ednsClientSubnet": "198.51.100.0/24" }

parseVPC

使用此处理器来解析 Amazon VPC 提供的日志、提取字段并将其转换为 JSON 格式。对编码后的字段值进行解码。

重要

parseVPC处理器仅处理默认 Amazon VPC 流日志格式的日志。它不适用于自定义 VPC 流日志。

此处理器仅接受@message作为输入。

重要

如果您使用此处理器,则它必须是变压器中的第一个处理器。

示例

以下面的日志事件为例:

2 123456789010 eni-abc123de 192.0.2.0 192.0.2.24 20641 22 6 20 4249 1418530010 1418530070 ACCEPT OK

处理器配置是这样的:

[ "parseVPC": {} ]

转换后的日志事件将如下所示。

{ "version": 2, "accountId": "123456789010", "interfaceId": "eni-abc123de", "srcAddr": "192.0.2.0", "dstAddr": "192.0.2.24", "srcPort": 20641, "dstPort": 22, "protocol": 6, "packets": 20, "bytes": 4249, "start": 1418530010, "end": 1418530070, "action": "ACCEPT", "logStatus": "OK" }

字符串变异处理器

lowerCaseString

lowerCaseString处理器将字符串转换为其小写版本。

字段 描述 必填? 默认 限制

带钥匙

要转换为小写的密钥列表

最多参赛人数:10

示例

以下面的日志事件为例:

{ "outer_key": { "inner_key": "INNER_VALUE" } }

变压器配置是这样的,lowerCaseString使用的是parseJSON

[ "parseJSON": {}, "lowerCaseString": { "withKeys":["outer_key.inner_key"] } ]

转换后的日志事件将如下所示。

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

upperCaseString

upperCaseString处理器将字符串转换为其大写版本。

字段 描述 必填? 默认 限制

带钥匙

要转换为大写的密钥列表

最多参赛人数:10

示例

以下面的日志事件为例:

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

变压器配置是这样的,upperCaseString使用的是parseJSON

[ "parseJSON": {}, "upperCaseString": { "withKeys":["outer_key.inner_key"] } ]

转换后的日志事件将如下所示。

{ "outer_key": { "inner_key": "INNER_VALUE" } }

SplitString

splitString处理器使用分隔字符将字段拆分为数组。

字段 描述 必填? 默认 限制

entries

条目数组。数组中的每个项目都必须包含sourcedelimiter字段。

最大参赛人数:100

分裂的关键

最大长度:128

分隔符

负责拆分的分隔符

最大长度:1

示例

以下面的日志事件为例:

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

变压器配置是这样的,splitString使用的是parseJSON

[ "parseJSON": {}, "splitString": { "entries": [ { "source": "outer_key.inner_key", "delimiter": "_" } ] } ]

转换后的日志事件将如下所示。

{ "outer_key": { "inner_key": [ "inner", "value" ] } }

替换字符串

substituteString处理器将键的值与正则表达式进行匹配,并将所有匹配项替换为替换字符串。

字段 描述 必填? 默认 限制

entries

条目数组。数组中的每一项都必须包含sourcefrom、和to字段。

最多参赛人数:10

修改的关键

最大长度:128

最大嵌套密钥深度:3

from

要替换的正则表达式字符串。使用双引号时必须使用\\ 对特殊正则表达式字符(例如 [和])进行转义,使用单引号时必须使用\ 进行转义。有关更多信息,请参阅 Oracle 网站上的类模式

最大长度:128

要替换每个匹配项的字符串 from

最大长度:128

示例

以下面的日志事件为例:

{ "outer_key": { "inner_key1": "[]", "inner_key2": "123-345-567" } }

变压器配置是这样的,substituteString使用的是parseJSON

[ "parseJSON": {}, "substituteString": { "entries": [ { "source": "outer_key.inner_key1", "from": "\\[\\]", "to": "value1" }, { "source": "outer_key.inner_key2", "from": "[0-9]{3}-[0-9]{3}-[0-9]{3}", "to": "xxx-xxx-xxx" } ] } ]

转换后的日志事件将如下所示。

{ "outer_key": { "inner_key1": "value1", "inner_key2": "xxx-xxx-xxx" } }

修剪字符串

trimString处理器删除密钥开头和结尾的空格。

字段 描述 必填? 默认 限制

带钥匙

要修剪的按键清单

最多参赛人数:10

示例

以下面的日志事件为例:

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

变压器配置是这样的,trimString使用的是parseJSON

[ "parseJSON": {}, "trimString": { "withKeys":["outer_key.inner_key"] } ]

转换后的日志事件将如下所示。

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

JSON 变异处理器

添加密钥

使用addKeys处理器向日志事件添加新的键值对。

字段 描述 必填? 默认 限制

entries

条目数组。数组中的每个项目都可以包含keyvalue、和overwriteIfExists字段。

最多参赛人数:5

要添加的新条目的密钥

最大长度:128

最大嵌套密钥深度:3

要添加的新条目的值

最大长度:256

overwriteIfExists

如果将其设置为true,则如果事件中key已经存在现有值,则会覆盖现有值。默认值为 false

false

示例

以下面的日志事件为例:

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

变压器配置是这样的,addKeys使用的是parseJSON

[ "parseJSON": {}, "addKeys": { "entries": [ { "source": "outer_key.new_key", "value": "new_value" } ] } ]

转换后的日志事件将如下所示。

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

删除密钥

使用deleteKeys处理器从日志事件中删除字段。这些字段可以包含键值对。

字段 描述 必填? 默认 限制

带钥匙

要删除的密钥列表。

最多参赛人数:5

示例

以下面的日志事件为例:

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

变压器配置是这样的,deleteKeys使用的是parseJSON

[ "parseJSON": {}, "deleteKeys": { "withKeys":["outer_key.inner_key"] } ]

转换后的日志事件将如下所示。

{ "outer_key": {} }

移动键

使用moveKeys处理器将密钥从一个字段移动到另一个字段。

字段 描述 必填? 默认 限制

entries

条目数组。数组中的每个项目都可以包含sourcetarget、和overwriteIfExists字段。

最多参赛人数:5

移动的钥匙

最大长度:128

最大嵌套密钥深度:3

target

移动的关键

最大长度:128

最大嵌套密钥深度:3

overwriteIfExists

如果将其设置为true,则如果事件中key已经存在现有值,则会覆盖现有值。默认值为 false

false

示例

以下面的日志事件为例:

{ "outer_key1": { "inner_key1": "inner_value1" }, "outer_key2": { "inner_key2": "inner_value2" } }

变压器配置是这样的,moveKeys使用的是parseJSON

[ "parseJSON": {}, "moveKeys": { "entries": [ { "source": "outer_key1.inner_key1", "target": "outer_key2" } ] } ]

转换后的日志事件将如下所示。

{ "outer_key1": {}, "outer_key2": { "inner_key2": "inner_value2", "inner_key1": "inner_value1" } }

重命名密钥

使用renameKeys处理器重命名日志事件中的密钥。

字段 描述 必填? 默认 限制

entries

条目数组。数组中的每个项目都可以包含keytarget、和overwriteIfExists字段。

最多参赛人数:5

重命名的关键

最大长度:128

target

新的密钥名称

最大长度:128

最大嵌套密钥深度:3

overwriteIfExists

如果将其设置为true,则如果事件中key已经存在现有值,则会覆盖现有值。默认值为 false

false

示例

以下面的日志事件为例:

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

变压器配置是这样的,renameKeys使用的是parseJSON

[ "parseJSON": {}, "renameKeys": { "entries": [ { "key": "outer_key", "target": "new_key" } ] } ]

转换后的日志事件将如下所示。

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

复制价值

使用copyValue处理器复制日志事件中的值。您还可以使用此处理器向日志事件添加元数据,方法是将以下元数据键的值复制到日志事件中:@logGroupName@logGroupStream@accountId@regionName。以下示例说明了这一点。

字段 描述 必填? 默认 限制

entries

条目数组。数组中的每个项目都可以包含sourcetarget、和overwriteIfExists字段。

最多参赛人数:5

要复制的密钥

最大长度:128

最大嵌套密钥深度:3

target

将值复制到的密钥

最大长度:128

最大嵌套密钥深度:3

overwriteIfExists

如果将其设置为true,则如果事件中key已经存在现有值,则会覆盖现有值。默认值为 false

false

示例

以下面的日志事件为例:

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

变压器配置是这样的,copyValue使用的是parseJSON

[ "parseJSON": {}, "copyValue": { "entries": [ { "source": "outer_key.new_key", "target": "new_key" }, { "source": "@logGroupName", "target": "log_group_name" }, { "source": "@logGroupStream", "target": "log_group_stream" }, { "source": "@accountId", "target": "account_id" }, { "source": "@regionName", "target": "region_name" } ] } ]

转换后的日志事件将如下所示。

{ "outer_key": { "inner_key": "inner_value" }, "new_key": "inner_value", "log_group_name": "myLogGroupName", "log_group_stream": "myLogStreamName", "account_id": "012345678912", "region_name": "us-east-1" }

listToMap

listToMap处理器获取包含键字段的对象列表,并将它们转换为目标键的映射。

字段 描述 必填? 默认 限制

中的密钥 ProcessingEvent 包含将要转换为地图的对象列表

最大长度:128

最大嵌套密钥深度:3

要在生成的地图中提取为键的字段的键

最大长度:128

ValueKey

如果指定了该值,则将从source对象中提取您在此参数中指定的值,并将其放入生成的地图的值中。否则,源列表中的原始对象将被放入生成的地图的值中。

最大长度:128

target

用于保存生成地图的字段的密钥

根节点

最大长度:128

最大嵌套密钥深度:3

flatten

一个布尔值,用于指示列表是扁平化为单个项目,还是生成的地图中的值将是列表。

默认情况下,匹配键的值将以数组表示。设置flattentrue为,根据的值将数组转换为单个值flattenedElement

false

flattenedElement

如果设置为 flattentrue,则使用flattenedElement来指定要保留哪个元素(firstlast)。

当设置为 flatten “时” 为必填项 true

值只能是firstlast

示例

以下面的日志事件为例:

{ "outer_key": [ { "inner_key": "a", "inner_value": "val-a" }, { "inner_key": "b", "inner_value": "val-b1" }, { "inner_key": "b", "inner_value": "val-b2" }, { "inner_key": "c", "inner_value": "val-c" } ] }

用例 1 的变压器:flattenfalse

[ "parseJSON": {}, "listToMap": { "source": "outer_key" "key": "inner_key", "valueKey": "inner_value", "flatten": false } ]

转换后的日志事件将如下所示。

{ "outer_key": [ { "inner_key": "a", "inner_value": "val-a" }, { "inner_key": "b", "inner_value": "val-b1" }, { "inner_key": "b", "inner_value": "val-b2" }, { "inner_key": "c", "inner_value": "val-c" } ], "a": [ "val-a" ], "b": [ "val-b1", "val-b2" ], "c": [ "val-c" ] }

用例 2 的变压器:flattentrueflattenedElementfirst

[ "parseJSON": {}, "listToMap": { "source": "outer_key" "key": "inner_key", "valueKey": "inner_value", "flatten": true, "flattenedElement": "first" } ]

转换后的日志事件将如下所示。

{ "outer_key": [ { "inner_key": "a", "inner_value": "val-a" }, { "inner_key": "b", "inner_value": "val-b1" }, { "inner_key": "b", "inner_value": "val-b2" }, { "inner_key": "c", "inner_value": "val-c" } ], "a": "val-a", "b": "val-b1", "c": "val-c" }

用例 3 的变压器:flattentrueflattenedElementlast

[ "parseJSON": {}, "listToMap": { "source": "outer_key" "key": "inner_key", "valueKey": "inner_value", "flatten": true, "flattenedElement": "last" } ]

转换后的日志事件将如下所示。

{ "outer_key": [ { "inner_key": "a", "inner_value": "val-a" }, { "inner_key": "b", "inner_value": "val-b1" }, { "inner_key": "b", "inner_value": "val-b2" }, { "inner_key": "c", "inner_value": "val-c" } ], "a": "val-a", "b": "val-b2", "c": "val-c" }

数据类型转换器处理器

TypeConverter

使用typeConverter处理器将与指定键关联的值类型转换为指定类型。它是一个转换处理器,可以更改指定字段的类型。值可以转换为以下数据类型之一:integerdoublestring和。boolean

字段 描述 必填? 默认 限制

entries

条目数组。数组中的每个项目都必须包含keytype字段。

最多参赛人数:10

带有要转换为其他类型的值的密钥

最大长度:128

最大嵌套密钥深度:3

type

要转换的类型。有效值包括 integerdoublestringboolean

示例

以下面的日志事件为例:

{ "name": "value", "status": "200" }

变压器配置是这样的,typeConverter使用的是parseJSON

[ "parseJSON": {}, "typeConverter": { "entries": [ { "key": "status", "type": "integer" } ] } ]

转换后的日志事件将如下所示。

{ "name": "value", "status": 200 }

日期时间转换器

使用datetimeConverter处理器将日期时间字符串转换为您指定的格式。

字段 描述 必填? 默认 限制

应用日期转换的密钥。

最多参赛人数:10

匹配模式

要与该source领域匹配的模式列表

最多参赛人数:5

target

用于存储结果的 JSON 字段。

最大长度:128

最大嵌套密钥深度:3

目标格式

用于目标字段中转换后的数据的日期时间格式。

yyyy-MM-dd'T'HH:mm:ss.SSS'Z

最大长度:64

源时区

源字段的时区。

有关可能值的列表,请参阅 Java 支持的区域 ID 和偏移量。

UTC

最小长度:1

目标时区

目标字段的时区。

有关可能值的列表,请参阅 Java 支持的区域 ID 和偏移量。

UTC

最小长度:1

locale

源字段的区域设置。

有关可能值的列表,请参阅 Java 中的 Locale getAvailableLocales () 方法和示例

最小长度:1

示例

以下面的日志事件为例:

{"german_datetime": "Samstag 05. Dezember 1998 11:00:00"}

变压器配置是这样的,dateTimeConverter使用的是parseJSON

[ "parseJSON": {}, "dateTimeConverter": { "source": "german_datetime", "target": "target_1", "locale": "de", "matchPatterns": ["EEEE dd. MMMM yyyy HH:mm:ss"], "sourceTimezone": "Europe/Berlin", "targetTimezone": "America/New_York", "targetFormat": "yyyy-MM-dd'T'HH:mm:ss z" } ]

转换后的日志事件将如下所示。

{ "german_datetime": "Samstag 05. Dezember 1998 11:00:00", "target_1": "1998-12-05T17:00:00 MEZ" }