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

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

你可以使用的处理器

本节包含有关可用于 LOG Event Transformers 的每个处理器的信息。处理器可以分为解析器、字符串变异器、JSON 变异器和日期处理器。

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

parseJSON

parseJSON 处理器解析 JSON 日志事件,并在目标下插入提取的 JSON 键值对。如果您未指定目的地,则处理器会将键值对放在根节点下。parseJSON用作第一个处理器时,必须使用作为源字段来@message解析整个日志事件。完成初始 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 模式

最大长度是 512

最大格罗克图案: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 模式列表中的预定义 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 Pattern 描述 最大模式限制 示例
用户名或用户 匹配一个或多个字符,可以包含小写字母(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"}

姿势 匹配不带前导零的整数,由一个或多个数字组成(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"}

不是空格 匹配一个或多个非空格字符。 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"}

带引号的字符串 将带引号的字符串(单引号或双引号)与转义字符匹配。 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"}

Amazon Grok 图案

模式 描述 最大模式限制 示例

ARN

匹配 Amazon Amazon 资源名称 (ARNs),捕获分区(awsaws-cn、或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 Pattern 描述 最大模式限制 示例
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"}

COMMONMA 用冒号匹配十六进制格式的 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映射 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 匹配% {IPv6} 支持 IPv4 的地址或% {IPv4} 支持的地址 IPv6 5

输入:192.168.0.1

模式:%{IP:ip}

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

主机名或主机 匹配域名,包括子域名 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"}

主机端口 匹配% {IPORHOST} 模式支持的 IP 地址或主机名,后跟冒号和端口号,在输出中将该端口捕获为 “端口”。 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"}

Path grok 模式

Grok Pattern 描述 最大模式限制 示例
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"}

路径 匹配 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 Pattern 描述 最大模式限制 示例
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) 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) 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"}

时间戳_ 01 ISO86 将 ISO86 01 日期时间格式 (yy) yy-(M) M-(d) dT (H) H: mm: (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"}

日期戳 匹配% {DATE},后面跟着% {TIME} 模式,用空格或连字符分隔。 20

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

模式:%{DATESTAMP:dateTime}

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

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

输入:PDT

模式:%{TZ:tz}

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

日期戳_ RFC822 按以下格式匹配日期和时间:日 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"}

日期戳_ RFC2822 匹配 RFC2822 日期时间格式:日,(d) d (yy) yy MonthName (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"}

日期戳_其他 按格式匹配日期和时间:日 MonthName (d) d (H) H: mm: (s) s 时区 (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"}

Log grok 模式

Grok Pattern 描述 最大模式限制 示例
LOGLEVEL 匹配不同大写和缩写的标准日志级别,包括:、、、Alert/ALERT、、、、Trace/TRACEDebug/DEBUGNotice/NOTICEInfo/INFO、、Warn/Warning/WARN/WARNINGErr/Error/ERR/ERRORCrit/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:“一月” 或 “一月”)时区:匹配% {INT} grok 模式 20

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

模式:%{HTTPDATE:date}

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

系统日志时间戳 将日期格式与 MonthName (d) d (H) H: mm :( s) s 匹配完整或缩写的英文月份名称(例如 MonthName:“Jan” 或 “January”) 20

输入:Nov 29 14:30:00

模式:%{SYSLOGTIMESTAMP:dateTime}

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

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

输入:user.profile/settings-page

模式:%{PROG:program}

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

SYSLOGPROG 匹配 PROG grok 模式(可选),后面是方括号中的进程 ID。 20

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

模式:%{SYSLOGPROG:programWithId}

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

SYSLOGH 匹配% {HOST} 或% {IP} 模式 5

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

模式:%{SYSLOGHOST:ip}

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

系统日志工具 匹配十进制格式的 syslog 优先级。该值应用尖括号 (<>) 括起来。 20

输入:<13.6>

模式:%{SYSLOGFACILITY:syslog}

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

常见的 log grok 模式

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

Grok 模式 描述 最大模式限制

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

输出:

{ "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" }
系统日志协议 (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,除非值为\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处理器将指定字段解析为键值对。您可以使用以下选项自定义处理器以解析字段信息。

字段 描述 必填? 默认 限制

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

@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 格式。对编码后的字段值进行解码。此处理器不支持 Amazon Route 53 Resolver 日志。

此处理器仅接受@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字段。

最大值:10

要拆分的字段值的键

最大长度:128

分隔符

用于分割字段值的分隔符字符串

最大长度:128

示例 1

请参见以下示例:

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

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

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

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

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

示例 2

要分割字符串的分隔符可以是多个字符。

请参见以下示例:

{ "outer_key": { "inner_key": "item1, item2, item3" } }

变压器配置如下:

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

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

{ "outer_key": { "inner_key": [ "item1", "item2", "item3" ] } }

替换字符串

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

字段 描述 必填? 默认 限制

entries

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

最大值:10

要修改的字段的密钥

最大长度:128

最大嵌套密钥深度:3

from

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

您可以将模式封装在里面(...)以创建带编号的捕获组,并创建可在to字段中引用的(?P<group_name>...)命名捕获组。

最大长度:128

可以使用字符串来替换捕获组的from反向引用的每个匹配项。使用表单 $n 表示编号组$1,如命名组,例如 $ {my_group}${group_name} >

最大长度:128

反向引用的最大数量:10

重复反向引用的最大数量:2

示例 1

请参见以下示例:

{ "outer_key": { "inner_key1": "[]", "inner_key2": "123-345-567", "inner_key3": "A cat takes a catnap." } }

变压器配置是这样的,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" }, { "source": "outer_key.inner_key3", "from": "cat", "to": "dog" } ] } } ]

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

{ "outer_key": { "inner_key1": "value1", "inner_key2": "xxx-xxx-xxx", "inner_key3": "A dog takes a dognap." } }

示例 2

请参见以下示例:

{ "outer_key": { "inner_key1": "Tom, Dick, and Harry", "inner_key2": "arn:aws:sts::123456789012:assumed-role/MyImportantRole/MySession" } }

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

[ { "parseJSON": {} }, { "substituteString": { "entries": [ { "source": "outer_key.inner_key1", "from": "(\w+), (\w+), and (\w+)", "to": "$1 and $3" }, { "source": "outer_key.inner_key2", "from": "^arn:aws:sts::(?P<account_id>\\d{12}):assumed-role/(?P<role_name>[\\w+=,.@-]+)/(?P<role_session_name>[\\w+=,.@-]+)$", "to": "${account_id}:${role_name}:${role_session_name}" } ] } } ]

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

{ "outer_key": { "inner_key1": "Tom and Harry", "inner_key2": "123456789012:MyImportantRole:MySession" } }

修剪字符串

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

DeleteKey

使用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" }