如何合并Splunk中匹配不同日志行的rex查询以提取关联字段
解决方案
你可以在同一条查询中依次声明两个rex提取规则,再通过日志的公共关联字段聚合两类事件的字段值即可,具体实现如下:
核心查询示例
# 先过滤你需要的数据源和时间范围,缩小扫描范围 index=your_index sourcetype=your_sourcetype ("foo bar" OR "baz qux") | rex field=log "foo bar (?<DATA>\d{1,6}).*" | rex field=log "baz qux (?<DATA2>\d{1,6}).*" # 按两类日志共有的关联字段聚合,示例用你日志里的Caller字段,如有唯一请求ID/TraceID可替换为更精准的字段 | stats values(DATA) as DATA values(DATA2) as DATA2 by Caller # 过滤掉同时没有两个字段的无效数据,也可以根据需求调整为保留至少有一个字段的条目 | where isnotnull(DATA) AND isnotnull(DATA2) # 后续做你需要的关联统计,比如计算差值、求相关性、计数等 | eval diff=DATA-DATA2 | table Caller DATA DATA2 diff
实现逻辑说明
- rex命令如果没有匹配到对应规则,只会将对应提取字段置空,不会报错也不会丢弃事件,因此两条rex可以共存互不影响
- 如果两类事件没有明确的唯一关联字段,可以按时间窗口做关联聚合,示例如下:
index=your_index sourcetype=your_sourcetype ("foo bar" OR "baz qux") | rex field=log "foo bar (?<DATA>\d{1,6}).*" | rex field=log "baz qux (?<DATA2>\d{1,6}).*" # 按1分钟为窗口分桶,聚合同时间窗口内的字段值,窗口大小可根据你的业务场景调整 | bin span=1m _time | stats values(DATA) as DATA values(DATA2) as DATA2 by _time | where isnotnull(DATA) AND isnotnull(DATA2)
常见调整方向
- 若同一个关联键下存在多个DATA/DATA2值,可以把
values()替换为latest()/earliest()取最新或最早的数值,或者用list()保留所有值 - 如果需要统计全局相关性,聚合时可以不加
by字段,直接用stats corr(DATA,DATA2) as 相关性系数计算两个字段的皮尔逊相关系数
内容的提问来源于stack exchange,提问作者DrSooch
相关产品推荐
相关产品推荐

