本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
parse
parse用于从日志字段中提取数据并创建可在查询中处理的提取字段。该parse命令支持四种模式:glob 表达式、正则表达式、logfmt 和 CSV。
fieldName如果省略,@message则默认使用。通过将字段名指定为第一个参数,可以从任何命名字段中进行解析。
如果日志事件与指定的模式不匹配,您仍会在结果中看到该事件,但不会显示提取的字段。
Glob 模式
使用通配符 (*) 作为要提取的值的占位符,然后使用将其分配给命名字段。as
语法
parsefieldName"pattern" asalias1,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)语法。
语法
parsefieldName/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模式后面添加关键字。
语法
parsefieldName/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分隔的对。
语法
parsefieldNamelogfmt asalias
结果是您使用点表示法访问的地图(例如lf.level,lf.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 日志行解析为结构化字段。每个以逗号分隔的值都分配给相应的别名。
语法
parsefieldNamecsv asalias1,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=用于从先前解析的对象字段中进行显式链式 JSON 提取。这使您无需重新解析原始消息即可从结构化字段中提取嵌套密钥。fieldName
语法
json field=fieldName"key.subkey" asalias
示例
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