亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Linux Shell > 正文

利用shell命令統計日志的方法詳解

2020-07-27 18:51:22
字體:
來源:轉載
供稿:網友

前言

大家都知道,通過使用 shell 命令可以很方便地對日志進行統計和分析,當服務有異常的時候,需要去排查日志,那么掌握一種統計日志的技巧就是必不可少的了。

假設有一個包含下面內容的日志文件 access.log。我們以統計這個文件的日志為例。

date=2017-09-23 13:32:50 | ip=40.80.31.153 | method=GET | url=/api/foo/bar?params=something | status=200 | time=9.703 | bytes=129 | referrer="-" | user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7" | cookie="-"date=2017-09-23 00:00:00 | ip=100.109.222.3 | method=HEAD | url=/api/foo/healthcheck | status=200 | time=0.337 | bytes=10 | referrer="-" | user-agent="-" | cookie="-"date=2017-09-23 13:32:50 | ip=40.80.31.153 | method=GET | url=/api/foo/bar?params=anything | status=200 | time=8.829 | bytes=466 | referrer="-" | user-agent="GuzzleHttp/6.2.0 curl/7.19.7 PHP/7.0.15" | cookie="-"date=2017-09-23 13:32:50 | ip=40.80.31.153 | method=GET | url=/api/foo/bar?params=everything | status=200 | time=9.962 | bytes=129 | referrer="-" | user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7" | cookie="-"date=2017-09-23 13:32:50 | ip=40.80.31.153 | method=GET | url=/api/foo/bar?params=nothing | status=200 | time=11.822 | bytes=121 | referrer="-" | user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7" | cookie="-"

不同的服務對應的日志可能不一樣,本文使用示例日志的格式是:

date | ip | method | url | status | time | bytes | referrer | user-agent | cookie

注意:mac 系統和 linux 系統中的命令行為可能不同,以下命令請在 linux 系統中使用

排除特殊日志

統計日志時,我們可能不關心 HEAD 請求,或者只關心 GET 請求,這里首先需要篩選日志,可以使用 grep 命令。-v 的含義是排除匹配的文本行。

grep GET access.log # 只統計 GET 請求grep -v HEAD access.log # 不統計 HEAD 請求grep -v 'HEAD/|POST' access.log # 不統計 HEAD 和 POST 請求

查看接口耗時情況

我們可以將每行的 time 匹配出來,然后做一個排序。使用 awk 的 match 方法可以匹配正則:

awk '{ match($0, /time=([0-9]+/.[0-9]+)/, result); print result[1]}' access.log

awk 命令使用方法如下:

awk '{pattern + action}' {filenames}

我們實際上只用到了 action:match($0, /time=([0-9]+/.[0-9]+)/, result); print result[1] 這一段。

match 方法接收三個參數:需要匹配的文本、正則表達式、結果數組。$0 代表 awk 命令處理的每一行,結果數組是可選的,因為我們要拿到匹配結果所以這里傳入了一個 result 數組,用來存儲匹配后的結果。

注意這里的正則我沒有使用 /d 來表示數字,因為 awk 指令默認使用 “EREs",不支持 /d 的表示,具體請看 linux shell 正則表達式(BREs,EREs,PREs)差異比較。

result 數組實際上和 javascript 里的結果數組很像了,所以我們打印出第二個元素,即匹配到的內容。執行完這行命令后結果如下:

9.7030.3378.8299.96211.822

當然實際上一天的日志可能是成千上萬條,我們需要對日志進行排序,且只展示前 3 條。這里使用到 sort 命令。

sort 命令默認從小到大排序,且當作字符串排序。所以默認情況下使用 sort 命令之后 "11" 會排在 "8" 前面。那么需要使用 -n 指定按數字排序,-r 來按從大到小排序,然后我們查看前 3 條:

awk '{ match($0, /time=([0-9]+/.[0-9]+)/, result); print result[1]}' access.log | sort -rn | head -3

結果:

11.8229.9629.703

查看耗時最高的接口

當然我們一般不會只查看接口耗時情況,還需要把具體日志也打印出來,上面的命令就不能滿足要求了。

awk 的打印默認是按空格分隔的,意思是 2017-09-23 GET 這一行如果使用 awk '{print $1}' 會打印出 "2017-09-23",類似地,$2 會打印出 GET。

根據日志特征,我們可以使用 | 來作為分隔符,這樣就能打印出各個我們感興趣的值了。因為我們想找出耗時最高的接口,那么我們把 time、date 和 url 單獨找出來。

awk 的 -F 參數用來自定義分隔符。然后我們可以數一下三個部分按 | 分隔后分別是第幾個:time 是第 6 個、date 是第 1 個、url 是第 4 個。

awk -F '|' '{print $6 $1 $4}' access.log

這樣打出來結果為:

 time=9.703 date=2017-09-23 13:32:50 url=/api/foo/bar?params=something time=0.337 date=2017-09-23 00:00:00 url=/api/foo/healthcheck time=8.829 date=2017-09-23 13:32:50 url=/api/foo/bar?params=anything time=9.962 date=2017-09-23 13:32:50 url=/api/foo/bar?params=everything time=11.822 date=2017-09-23 13:32:50 url=/api/foo/bar?params=nothing

因為我們想按 time 來排序,而 sort 可以按列來排序,而列是按空格分隔的,我們目前第一列是 time=xxx,是不能排序的,所以這里要想辦法把 time= 給去掉,因為我們很雞賊地把耗時放在了第一列,那么其實再通過 time= 進行分隔一下就行了。

awk -F '|' '{print $6 $1 $4}' access.log | awk -F 'time=' '{print $2}'

結果:

9.703 date=2017-09-23 13:32:50 url=/api/foo/bar?params=something0.337 date=2017-09-23 00:00:00 url=/api/foo/healthcheck8.829 date=2017-09-23 13:32:50 url=/api/foo/bar?params=anything9.962 date=2017-09-23 13:32:50 url=/api/foo/bar?params=everything11.822 date=2017-09-23 13:32:50 url=/api/foo/bar?params=nothing

使用 sort 的 -k 參數可以指定要排序的列,這里是第 1 列;再結合上面的排序,就能把耗時最高的日志打印出來了:

awk -F '|' '{print $6 $1 $4}' access.log | awk -F 'time=' '{print $2}' | sort -k1nr | head -3

結果:

11.822 date=2017-09-23 13:32:50 url=/api/foo/bar?params=nothing9.962 date=2017-09-23 13:32:50 url=/api/foo/bar?params=everything9.703 date=2017-09-23 13:32:50 url=/api/foo/bar?params=something

統計請求次數最多的接口

如果需要統計哪些接口每天請求量是最多的,只需要新引入 uniq 命令。

我們已經可以通過 grep -v HEAD access.log | awk -F '|' '{print $4}' 來篩選出所有的 url,uniq 命令可以刪除 相鄰 的相同的行,而 -c 可以輸出每行出現的次數。

所以我們先把 url 排序以讓相同的 url 放在一起,然后使用 uniq -c 來統計出現的次數:

grep -v HEAD access.log | awk -F '|' '{print $4}' | sort | uniq -c

因為示例日志數量太少,我們假設日志里有多條,那么結果應該類似下面:

1 url=/api/foo/bar?params=anything19 url=/api/foo/bar?params=everything4 url=/api/foo/bar?params=nothing5 url=/api/foo/bar?params=something

接下來再 sort 即可:

grep -v HEAD access.log | awk -F '|' '{print $4}' | sort | uniq -c | sort -k1nr | head -10

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品中文字幕电影| 欧美老肥婆性猛交视频| 91精品国产色综合| 国产91在线播放九色快色| 91av视频在线观看| 91精品国产高清自在线看超| 国产精品扒开腿做爽爽爽视频| 欧美午夜精品久久久久久浪潮| 97国产成人精品视频| 亚洲电影在线观看| 日韩影视在线观看| 国产+成+人+亚洲欧洲| 亚洲老头老太hd| 伊人一区二区三区久久精品| 亚洲品质视频自拍网| 尤物九九久久国产精品的分类| 自拍偷拍亚洲在线| 久久久久久这里只有精品| 亚洲欧洲中文天堂| 国产一区二区三区直播精品电影| 一区二区三区回区在观看免费视频| 国产精品免费在线免费| 国产精品视频久久久久| 亚洲免费电影在线观看| 国产精品入口免费视频一| 精品福利免费观看| 欧美激情久久久久久| 91久久久久久国产精品| 欧美疯狂性受xxxxx另类| 麻豆国产精品va在线观看不卡| 国产欧美精品日韩精品| 色综合久久天天综线观看| 77777亚洲午夜久久多人| 欧美精品做受xxx性少妇| 日韩精品在线免费观看视频| 亚洲性夜色噜噜噜7777| 日韩成人在线免费观看| 亚洲国产精品va在线| 亚洲国产精品va在线| 国产精品久久久久久五月尺| 亚洲欧美国内爽妇网| 97精品在线视频| 国产精品aaa| 欧美在线欧美在线| 成人网页在线免费观看| 亚洲国产精品久久久久| 尤物yw午夜国产精品视频明星| 日韩在线视频免费观看| 欧美精品在线播放| 国产精品9999| 久久精品国产精品| 91精品国产综合久久久久久久久| 久久黄色av网站| 久久精品在线播放| 精品香蕉一区二区三区| 8x拔播拔播x8国产精品| 日韩精品在线免费观看视频| 亚洲国产91精品在线观看| 日韩电影免费观看中文字幕| 最近2019中文字幕大全第二页| 国产精品91久久久| 国产成人精品最新| 欧美性猛交xxxx乱大交蜜桃| 中文字幕精品久久久久| 欧美黑人一级爽快片淫片高清| 欧美国产日韩一区二区三区| 欧美精品在线网站| 国外成人免费在线播放| 久久久久国产精品www| 国产噜噜噜噜噜久久久久久久久| 一区国产精品视频| 九九热最新视频//这里只有精品| 国产成人精品最新| 亚洲欧美日韩国产成人| 色综合色综合网色综合| xxx欧美精品| 91理论片午午论夜理片久久| 亚洲人成网在线播放| 日韩一二三在线视频播| 亚洲人精选亚洲人成在线| 69**夜色精品国产69乱| 久久影视电视剧免费网站| 欧美孕妇性xx| 在线观看国产欧美| 91中文在线视频| 色先锋久久影院av| 亚洲第一男人天堂| 久久欧美在线电影| 正在播放欧美视频| 欧美福利视频在线观看| 尤物精品国产第一福利三区| 日本精品一区二区三区在线| 亚洲激情电影中文字幕| 日韩高清电影免费观看完整| 久久精品精品电影网| 欧美夫妻性视频| 福利一区视频在线观看| 亚洲精品视频免费| 久久视频在线直播| 欧洲亚洲在线视频| 91精品国产91久久久久久最新| 欧美性xxxxxxx| 亚洲精品自拍偷拍| x99av成人免费| 欧美午夜女人视频在线| 国产精品av免费在线观看| 欧美激情亚洲国产| 国产成人精品国内自产拍免费看| 中国日韩欧美久久久久久久久| 亚洲网在线观看| 国产欧美日韩中文字幕在线| 欧美国产日韩精品| 欧美大片免费看| 日韩高清欧美高清| 精品国产一区二区三区久久狼5月| 欧美性受xxxx黑人猛交| 91精品国产九九九久久久亚洲| 欧美日韩国产一区二区三区| 丝袜亚洲欧美日韩综合| 欧美高清激情视频| 亚洲综合大片69999| 国产综合在线观看视频| 国产精品男人的天堂| 欧美日本中文字幕| 国产精品视频免费在线观看| 亚洲精品国产suv| 中文字幕av一区二区三区谷原希美| 97免费中文视频在线观看| 亚洲天堂2020| 日韩暖暖在线视频| 一区国产精品视频| 国产激情视频一区| 国产精品视频xxx| 日韩在线观看网址| 久久精品美女视频网站| 中文字幕欧美日韩va免费视频| 久久偷看各类女兵18女厕嘘嘘| 欧美野外wwwxxx| 亚洲精品视频在线播放| 亚洲人成电影网站色…| 国产精品男女猛烈高潮激情| 在线观看久久久久久| 国产精品第2页| 亚洲电影免费观看| 日韩在线视频中文字幕| 国产精品久久77777| 国产美女扒开尿口久久久| 中文字幕在线国产精品| 欧美高清视频一区二区| 亚洲精品videossex少妇| 欧美激情2020午夜免费观看| 国产欧美日韩丝袜精品一区| 91精品啪aⅴ在线观看国产| 日韩激情在线视频| 欧美极度另类性三渗透| 91精品国产亚洲| www欧美日韩| 久久视频免费在线播放| 久久99亚洲精品| 中国人与牲禽动交精品| 国产精品第一页在线| 综合久久五月天| 国产伊人精品在线| 国产免费成人av|