View a markdown version of this page

parse - 亚马逊 CloudWatch 日志

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

parse

parse用于从日志字段中提取数据并创建可在查询中处理的提取字段。该parse命令支持四种模式:glob 表达式、正则表达式、logfmt 和 CSV。

fieldName如果省略,@message则默认使用。通过将字段名指定为第一个参数,可以从任何命名字段中进行解析。

如果日志事件与指定的模式不匹配,您仍会在结果中看到该事件,但不会显示提取的字段。

Glob 模式

使用通配符 (*) 作为要提取的值的占位符,然后使用将其分配给命名字段。as

语法

parse fieldName "pattern" as alias1, alias2

*通配符的数量必须等于别名的数量。

示例

parse @message "user=*, method:*, latency := *" as @user, @method, @latency | stats avg(@latency) by @method, @user
parse @logStream "*/*/*/*" as env, service, instance, shard | stats count(*) by env, service

链式解析

提取一个字段,然后进一步解析提取的字段。

parse @message "url=*" as url | parse url "/api/*/users/*" as apiVersion, userId | display apiVersion, userId

正则表达式模式

使用带有命名捕获组的正则表达式来提取字段。有关正则表达式语法的信息,请参阅 支持的正则表达式(regex)语法

语法

parse fieldName /regex/

使用命名的捕获组(?<name>...)来定义提取的字段。

示例

使用命名的捕获组提取字段

parse @message /user=(?<user2>.*?), method:(?<method2>.*?), latency := (?<latency2>.*?)/ | stats avg(latency2) by @method2, @user2

使用命名的捕获组从 VPC 流日志中提取 ENI

parse @message /(?<NetworkInterface>eni-.*?) / | display NetworkInterface, @message

Multi-match mode

使用多重匹配模式从字段中提取正则表达式的所有匹配项,从而为每个日志事件生成多行。在正则表达式multi模式后面添加关键字。

语法

parse fieldName /regex/ multi

示例

从日志行中提取所有 IP 地址(多重匹配)

parse @message /(\d+\.\d+\.\d+\.\d+)/ as ip_addr multi | stats count(*) by ip_addr

logfmt 模式

用于parse logfmt将 logfmt 格式的日志行解析为键值对。Logfmt 是一种结构化日志格式,其中每行都包含以空格key=value分隔的对。

语法

parse fieldName logfmt as alias

结果是您使用点表示法访问的地图(例如lf.levellf.msg)。

示例

parse @message logfmt as lf | filter lf.level = "error" | display lf.msg, lf.duration
parse @message logfmt as lf | stats count(*) by lf.host

CSV 模式

用于parse csv将 CSV-formatted 日志行解析为结构化字段。每个以逗号分隔的值都分配给相应的别名。

语法

parse fieldName csv as alias1, alias2, alias3

示例

parse @message csv as timestamp, level, message | filter level = "ERROR" | display timestamp, message
parse @message csv as host, method, path, status, duration | stats avg(duration) by method

JSON 字段提取

json field=fieldName用于从先前解析的对象字段中进行显式链式 JSON 提取。这使您无需重新解析原始消息即可从结构化字段中提取嵌套密钥。

语法

json field=fieldName "key.subkey" as alias

示例

parse @message /(?<payload>\{.*\})/ as payload | json field=payload "user.name" as username | display username
json field=requestContext "identity.sourceIp" as caller_ip | stats count(*) by caller_ip