如何用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
命令解释:
date -d "1 hour ago" +"%Y-%m-%d %H:%M:%S":生成当前时间1小时前的时间字符串,格式和日志前19位完全一致,直接做字符串比较就能判断时间范围。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
相关产品推荐
相关产品推荐

