如何在Splunk中关联两类日志查询指定失败转账交易?
Splunk查询指定账户的特定失败转账交易方案
完全可行,核心是先从两类日志中提取统一命名的transaction-id字段,再通过关联查询筛选出符合条件的交易。以下是具体实现方法:
方法一:使用join关联(符合你提到的思路)
1. 从交易详情日志中提取目标账户的交易ID
先筛选出accountNo=123的交易记录,提取对应的transaction_id:
index=你的索引 sourcetype=你的源类型 "Transfer money" | rex "\"accountNo\" : \"(?<accountNo>[^\"]+)\"" | rex "\"transaction-id\":\"(?<transaction_id>[^\"]+)\"" | where accountNo="123" | fields transaction_id accountNo
2. 从异常日志中提取失败交易的ID
筛选出指定错误信息的日志,提取其中的transaction_id:
index=你的索引 sourcetype=你的源类型 "Transfer failed, mainframe is offline" | rex "\[(?<transaction_id>[^\]]+)\]" | fields transaction_id
3. 关联两个结果
将上述两个查询通过transaction_id关联,得到最终结果:
index=你的索引 sourcetype=你的源类型 "Transfer money" | rex "\"accountNo\" : \"(?<accountNo>[^\"]+)\"" | rex "\"transaction-id\":\"(?<transaction_id>[^\"]+)\"" | where accountNo="123" | fields transaction_id accountNo | join transaction_id [ search index=你的索引 sourcetype=你的源类型 "Transfer failed, mainframe is offline" | rex "\[(?<transaction_id>[^\]]+)\]" | fields transaction_id ] | table accountNo transaction_id
方法二:使用stats聚合(大数据量下更高效)
如果日志数据量较大,join可能存在性能瓶颈,推荐用stats按交易ID聚合筛选:
index=你的索引 sourcetype=你的源类型 ("Transfer money" OR "Transfer failed, mainframe is offline") | rex "\"accountNo\" : \"(?<accountNo>[^\"]+)\"" | rex "\"transaction-id\":\"(?<transaction_id>[^\"]+)\"" | rex "\[(?<transaction_id>[^\]]+)\]" | eval is_failed=if(searchmatch("Transfer failed, mainframe is offline"), 1, 0) | eval is_target_account=if(accountNo="123", 1, 0) | stats max(is_failed) as failed max(is_target_account) as target_account by transaction_id | where failed=1 AND target_account=1 | table transaction_id
说明:
- 两个
rex语句会分别匹配两类日志中的交易ID,自动为每条日志补全transaction_id字段 - 通过
eval标记每条日志是否属于目标账户、是否是指定错误的异常记录 - 最后用
stats按交易ID聚合,筛选出同时满足“来自账户123”和“因指定原因失败”的交易
内容的提问来源于stack exchange,提问作者lecarpetron dookmarion
相关产品推荐
相关产品推荐

