程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 截取與分析日志文件的特定行數的操作

截取與分析日志文件的特定行數的操作

編輯:MySQL綜合教程

截取與分析日志文件的特定行數的操作


在進行操作系統和數據庫系統管理時,經常會遇到在日志文件中查找某個字符,或者按照時間截取某個時間段的日志進行分析。
今天早上就遇到一個MySQL數據庫上的問題,mysql數據庫在0-3點的時候,數據庫會話連接,tps,cpu和iowait等都比平時大了許多。
為了定位這個時間段內,到底發生了那些慢查詢,消耗了資源,就需要在slow.log慢查詢日志進行查詢,截取和分析。

在處理過程中,對幾種常用的日志截取方法進行了匯總和測試:

截取日志段的的方法匯總與測試
方式一: 確定時間段的行號,使用head和tail命令截取 搜索時間: Time: 151212 00:00:00 先到gg,到文件最前面,然後搜索 /Time: 151212 ,得到: 1979016 # Time: 151212 0:00:15

文件總行數為: # wc -l slow-query-169-1212.log 1999422 slow-query-169-1212.log 1999422 limit 0,20;


然後在到文件最後面,G, 搜索4點之後開始的文件 /Time: 151212 4 ,得到: 1987392 # Time: 151212 4:00:05

確定需要查詢的時間段行號後,使用head和tail命令進行截取: >>> 1987392 - 1979016; 8376

需要截取的日志,最後行號為 1979016,想用head 命令,然後在用tail命令截取最後的 8376 行即可,命令為: head -n 1979016 slow-query-169-1212.log | tail -n 8376 > slow-query-169-1212_00-03.log

方式二: 確定時間段的行號,使用sed命令截取 截取 151212 0-3點之間的慢查詢日志: sed -n '1979016,1987392p' slow-query-169-1212.log > slow-query-169-1212_00-03.log

>>> 1987392 - 1979016; 8376 該部分文件,應該有 8376 行數據;確認正常;

方式三:確定時間段行號後,使用awk命令截取 截取 151212 0-3點之間的慢查詢日志: awk -F"\n" '{if(NR>=1979016&&NR <=1987392)print $0 }' slow-query-169-1212.log > slow-query-169-1212_00-03.log

方式四:不需先確定行號,直接用sed取出日志段 slow log都是以 # Time: 151212 0:00:15 開頭,直接用sed 取出其中的日志: sed -n '/^# Time: 151212 0/,/^# Time: 151212 4/p' slow-query-169-1212.log > part.log --這樣的效果,就和剛才上面的效果相同,取出了0 -3 點之間的數據

如果是想取出 151211 這一天的數據,則命令為: sed -n '/^# Time: 151211/,/^# Time: 151212/p' slow-query-169-1212.log > part.log --取出了151211 這一天的日志

注意,使用sed 時,兩行之間的選擇項一定要對應,不然結果就不是想要的結果了: sed -n '/^# Time: 151212/,/^# Time: 151212 4/p' slow-query-169-1212.log > part.log --前後兩個時間點不同,搜索的是全部 # Time: 151212開頭的

使用pt工具對截取的日志進行分析 分析這段時間的日志的命令如下: /usr/local/pt/bin/pt-query-digest /data/bbs/slow-query-169-1212_00-03.log > /data/bbs/slow-query-169-1212_00-03-report.log

這是默認的分析和排序方法,可以根據需求,選擇其他pt報告分析方法


注1 vim中兩種查詢方式: 命令模式下,按‘/’,然後輸入要查找的字符,Enter。?和/的區別是,一個向前(下)找,一個向後(上)。 另外,‘*’可以查找當前光標下的word(完全符合),‘g*’則部分符合,以#代替*表示向後(上)找



注2 幾種文件處理方法的簡單舉例: sed是按行處理的,不會將整個文件加載到內存中,可以放心使用 要切出從2012-02-09到2012-09-10的所有數據行,(假設你的日志文件以yyyy-MM-dd的日期格式開頭)只需要: sed -n '/^2012-02-09/,/^2012-09-10/p' whole.log > part.log

無論怎麼樣你都必須使用某一個程序把這個文件讀出來,並且用一定的規則來加以過濾。 在Linux中,使用cat和grep對文件進行操作已經可以說是最經濟合理的了。 占用一定的系統資源是肯定的,具體的話跟你使用的cat,grep以及linux內核都有一定關系,所以可能會略有不同。 一般不要在系統裡出現那麼大的日志文件,最好在一開始就做好日志的大小限制以及合理的日志轉儲和備份。

顯示文件的第2到第6行 sed -n '2,6p' file

需要加-n參數. head -n 6 file|tail -n 4


awk 也能達到要求 awk -F"\n" '{if(NR>=2&&NR <=6)print $0 }' file

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved