You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用grep统计最近1小时内耗时超10000ms的慢查询数量

慢查询日志精准统计方案

问题说明

日志文件格式示例:

2022-08-13 19:15:17.170 INFO 550034 --- [ scheduling-3] org.hibernate.SQL_SLOW : SlowQuery: 11387 milliseconds. SQL:

需要统计同时满足以下两个条件的慢查询行数:

  • 日志时间(取每行前19位,格式为YYYY-MM-DD HH:MM:SS)在当前时间往前1小时范围内
  • 查询耗时超过10000毫秒

之前尝试的grep "SQL_SLOW" app.log | wc -l只能统计所有慢查询,无法满足上述两个过滤条件。

解决方法

方法一:用awk一站式处理(推荐)

# 生成1小时前的标准时间字符串(和日志时间格式对齐)
start_time=$(date -d "1 hour ago" +"%Y-%m-%d %H:%M:%S")

# 执行统计
awk -v start="$start_time" '
    /SQL_SLOW/ {
        log_time = substr($0, 1, 19)
        match($0, /SlowQuery: ([0-9]+) milliseconds/, ms)
        if (log_time >= start && ms[1] > 10000) count++
    }
    END {print count}
' app.log

命令解释:

  1. date -d "1 hour ago" +"%Y-%m-%d %H:%M:%S":生成当前时间1小时前的时间字符串,格式和日志前19位完全一致,直接做字符串比较就能判断时间范围。
  2. awk脚本逻辑:
    • 先筛选包含SQL_SLOW的行(只处理慢查询日志)
    • 用substr($0, 1, 19)提取日志行的前19位作为日志时间
    • 用正则match抓取耗时的数字部分
    • 同时满足时间在1小时内、耗时大于10000ms时,计数器加1
    • 最后输出统计结果

方法二:grep+awk组合(适合分步验证)

如果需要分步查看过滤结果,可以拆分命令:

start_time=$(date -d "1 hour ago" +"%Y-%m-%d %H:%M:%S")

# 第一步:过滤耗时>10000ms的慢查询;第二步:过滤时间在1小时内的;最后统计行数
grep -P "SlowQuery: (1[0-9]{4}|[2-9][0-9]{4,}) milliseconds" app.log | awk -v start="$start_time" 'substr($0,1,19)>=start' | wc -l

适配不同系统的注意点

  • 如果是macOS或BSD系统,date命令参数不同,生成1小时前时间的命令要改成:date -v -1H +"%Y-%m-%d %H:%M:%S"
  • 确保日志时间是YYYY-MM-DD HH:MM:SS格式,这种格式的字符串可以直接按字典序比较时间先后,无需转成时间戳。

内容的提问来源于stack exchange,提问作者BoLjshOJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:25:05