如何在Sumo日志查询中获取目标日志±1秒范围内的日志信息?
Sumo日志查询问题解决:获取目标日志前后±1秒日志
问题说明
尝试用以下Sumo查询获取目标日志行前后±1秒的日志但未成功,且使用maxspan和transaction子句时出现“未找到”错误:
"BlockedThreadChecker" AND " - Thread Thread" AND " has been blocked" | parse regex "Thread Thread\[.*?\] has been blocked for (?<blocked_time_ms>\d+) ms" | where blocked_time_ms != "" | fields _raw, _messageTime , blocked_time_ms // Step 2: Create a transaction around the identified log entry within a +/-1 second window | where _messageTime >= _messageTime - 1000ms and _messageTime <= _messageTime + 1000ms | parse regex "io.vertx.core.VertxException: (?<exception_message>[^\n]+)" nodrop | fields _raw, _messageTime, exception_message // Step 3: Extract relevant details from the surrounding logs | parse regex "Thread Thread\[(?<thread_name>[^,]+),.*?has been blocked for (?<blocked_time_ms>\d+) ms" nodrop | fields thread_name, blocked_time_ms, exception_message, _sourceCategory, _raw // Step 4: Display the results | sort by _messageTime
问题根源
- 时间过滤逻辑无效:
where _messageTime >= _messageTime - 1000ms这行条件永远为真,等于没做任何时间范围筛选——每条日志的时间减去1秒必然小于等于自身。 - 数据集范围错误:查询一开始就只筛选出了阻塞线程的日志,后续操作无法获取周围的其他日志。
transaction用法错误:使用transaction时未指定正确的分组关联字段(如线程名),或未设置合理的时间跨度,导致无法聚合相关日志。
解决方案
方案一:用lookup关联目标日志与前后日志
先捕获目标日志的时间和线程信息,再匹配对应时间范围内的所有日志:
// 1. 捕获目标阻塞日志,提取关键信息 "BlockedThreadChecker" AND " - Thread Thread" AND " has been blocked" | parse regex "Thread Thread\[(?<thread_name>[^,]+),.*?has been blocked for (?<blocked_time_ms>\d+) ms" | fields _messageTime, thread_name, blocked_time_ms // 2. 关联所有在目标日志±1秒内的日志(可根据_sourceCategory缩小范围) | lookup from ( * | fields _raw, _messageTime | parse regex "Thread Thread\[(?<thread_name>[^,]+)" nodrop ) on thread_name where _messageTime between (lookup._messageTime - 1000ms) and (lookup._messageTime + 1000ms) // 3. 提取异常信息并整理结果 | parse regex "io.vertx.core.VertxException: (?<exception_message>[^\n]+)" nodrop | fields thread_name, blocked_time_ms, exception_message, _sourceCategory, _raw, _messageTime | sort by thread_name, _messageTime
方案二:正确使用transaction子句
通过transaction按线程分组,以阻塞日志为起点聚合前后1秒的日志:
// 1. 获取所有相关日志(不要提前过滤,确保包含目标和周围日志) * | parse regex "Thread Thread\[(?<thread_name>[^,]+)" nodrop // 2. 按线程分组,聚合前后1秒的日志(总跨度设为2秒) | transaction thread_name maxspan=2s startswith=("BlockedThreadChecker" AND " has been blocked") // 3. 提取所需字段并整理 | parse regex "Thread Thread\[.*?\] has been blocked for (?<blocked_time_ms>\d+) ms" nodrop | parse regex "io.vertx.core.VertxException: (?<exception_message>[^\n]+)" nodrop | fields thread_name, blocked_time_ms, exception_message, _sourceCategory, _raw, _messageTime
注意事项
- 使用
lookup时,若不需要按线程关联,可去掉on thread_name条件,仅按时间范围匹配。 - 使用
transaction时,必须指定分组字段(如thread_name),否则无法将相关日志聚合在一起;maxspan需设置为覆盖前后1秒的总跨度(即2秒)。 - 查询时可通过
_sourceCategory等字段缩小日志范围,提升查询效率。
内容的提问来源于stack exchange,提问作者Dnyaneshwar Jadhav
相关产品推荐
相关产品推荐

