首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

日志文件按時間範圍截取與分析實戰技巧

     編輯:MySQL 綜合教學

日志文件按時間範圍截取與分析實戰技巧

運維中常需從巨大日志(如 MySQL slow.log)按時間段切片分析。本文總結 head/tail、sed、awk、vim 多種截取方法,並演示 pt-query-digest 深度分析流程。

一、場景:提取 MySQL 慢查詢日志 00:00-04:00 區間

日志格式:# Time: 151212 0:00:15

二、方法對比

1. 確定行號 + head/tail

# 1. 找起始行
grep -n '^# Time: 151212 0' slow.log | head -1
# → 1979016

# 2. 找結束行(04:00 之後第一行)
grep -n '^# Time: 151212 4' slow.log | head -1
# → 1987392

# 3. 截取
head -n 1987392 slow.log | tail -n 8376 > slow_00-04.log

2. 確定行號 + sed

sed -n '1979016,1987392p' slow.log > slow_00-04.log

3. 確定行號 + awk

awk -F'\n' '{if(NR>=1979016 && NR<=1987392) print $0}' slow.log > slow_00-04.log

4. 直接按模式範圍 sed(無需先算行號)★推薦

# 截取 00:00 到 04:00(不含 04:00)
sed -n '/^# Time: 151212 0/,/^# Time: 151212 4/p' slow.log > part.log

# 截取整天 151211
sed -n '/^# Time: 151211/,/^# Time: 151212/p' slow.log > day.log

注意:起止模式必須唯一匹配,否則會多截取。

三、vim 快速定位技巧

  • /pattern 向下搜,?pattern 向上搜。
  • * 搜尋光標下單詞(整詞),g* 部分匹配。
  • gg 跳首行,G 跳尾行。

四、pt-query-digest 深度分析

# 安裝 Percona Toolkit
yum install percona-toolkit -y

# 分析切片日志
pt-query-digest slow_00-04.log > slow_00-04_report.log

# 按響應時間排序 Top 10
pt-query-digest --limit 10 --order-by Query_time:sum slow_00-04.log

# 只分析 SELECT
pt-query-digest --filter '$event->{fingerprint} =~ /^SELECT/' slow_00-04.log

五、大文件處理原則

  1. 流式處理:sed/awk 按行流式讀取,不載入全文件內存,安全處理 GB 級日志。
  2. 避免 cat+grep 管道:cat big.log | grep ... 會雙倍讀取 I/O,直接 grep ... big.log。
  3. 日誌輪轉:配置 logrotate 每日切割、壓縮、保留 7-30 天,杜絕單文件過大。
  4. 預先建立索引:如 grep -n '^# Time:' slow.log > slow.idx,後續按行號秒級切片。

六、常用一鍵腳本

#!/bin/bash
# usage: extract_slow.sh slow.log "151212 0" "151212 4" out.log
LOG=$1; START=$2; END=$3; OUT=$4
sed -n "/^# Time: $START/,/^# Time: $END/p" "$LOG" > "$OUT"
echo "Extracted $(wc -l < $OUT) lines to $OUT"
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved