怎么使用MongoDB分析Nginx日志

這篇文章主要介紹“怎么使用MongoDB分析Nginx日志”,在日常操作中,相信很多人在怎么使用MongoDB分析Nginx日志問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么使用MongoDB分析Nginx日志”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站專注于競(jìng)秀網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供競(jìng)秀營(yíng)銷型網(wǎng)站建設(shè),競(jìng)秀網(wǎng)站制作、競(jìng)秀網(wǎng)頁(yè)設(shè)計(jì)、競(jìng)秀網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造競(jìng)秀網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供競(jìng)秀網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

日志解析流程

正常情況下,關(guān)于nginx日志解析的流程如下所示:

怎么使用MongoDB分析Nginx日志

一般情況下我們會(huì)對(duì)要解析的日志提前進(jìn)行切分,常用的方式是按照日期,然后保存1個(gè)星期的日志。然后接下來(lái)就是日志的解析了,在這個(gè)過(guò)程中會(huì)使用到一些工具或編程語(yǔ)言,例如awk、grep、perl、python。

最后的入庫(kù)和可視化處理一般視業(yè)務(wù)而定,沒(méi)有強(qiáng)制的要求。

日志查詢的解決方案

而關(guān)于nginx日志解析的常用解決方案主要有如下4種方式:

  1. 通過(guò)awk和grep進(jìn)行解析

  2. 通過(guò)postgresql外聯(lián)表進(jìn)行日志的映射

  3. 通過(guò)python與mongodb的組合來(lái)進(jìn)行日志查詢

  4. 通過(guò)elk這個(gè)開源套件進(jìn)行查詢

其中postgresql外聯(lián)表的方式在之前公司的時(shí)候已經(jīng)使用過(guò),當(dāng)然是對(duì)公司多個(gè)3gb大小的日志進(jìn)行處理。而第1種和第4種解決方案沒(méi)有太多的實(shí)踐的經(jīng)驗(yàn),這里我們主要來(lái)看第2種解決方案。

日志格式

關(guān)于日志解析處理,我們比較常用的方式是使用正則表達(dá)式來(lái)進(jìn)行匹配,而常用的1個(gè)庫(kù)是nginxparser,我們可以直接通過(guò)pip進(jìn)行安裝。當(dāng)然還有其他的方式來(lái)進(jìn)行解析,這個(gè)要視業(yè)務(wù)而定。

在日志解析中,比較重要的是日志的格式,默認(rèn)情況下nginx的日志格式如下:

log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
     '$status $body_bytes_sent "$http_referer" ' 
     '"$http_user_agent" "$http_x_forwarded_for"' 
     '$upstream_addr $upstream_response_time $request_time;

下面我們來(lái)看實(shí)際業(yè)務(wù)中的1個(gè)應(yīng)用。之前公司有1個(gè)搶微信紅包的活動(dòng),當(dāng)然有用戶反映好幾天都無(wú)法搶到1個(gè)紅包。因此,我們團(tuán)隊(duì)成員認(rèn)為可能在這個(gè)過(guò)程中存在作弊的現(xiàn)象,因此便決定對(duì)nginx的日志進(jìn)行解析。

下面是1條真實(shí)的日志的記錄:

101.226.89.14 - - [10/jul/2016:07:28:32 +0800] "get /pocketmoney-2016-xikxcpck.html http/1.1" 302 231 "-" "mozilla/5.0 (linux; android 5.1; oppo r9tm build/lmy47i) applewebkit/537.36 (khtml, like gecko) version/4.0 chrome/37.0.0.0 mobile mqqbrowser/6.2 tbs/036548 safari/537.36 micromessenger/6.3.22.821 nettype/wifi language/zh_cn"

日志分析

通過(guò)awk進(jìn)行解析

接著,我們來(lái)看下如何使用awk解析出ip訪問(wèn)最多的記錄,關(guān)于awk語(yǔ)法可以參考進(jìn)行學(xué)習(xí):

dog@dog-pc:~$ awk '{a[$1]++}end{for(i in a)print i,a[i]}' nginx.log |sort -t ' ' -k2 -rn|head -n 10 
111.167.50.208 26794 
183.28.6.143 16244 
118.76.216.77 9560 
14.148.114.213 3609 
183.50.96.127 3377 
220.115.235.21 3246 
222.84.160.249 2905 
121.42.0.16 2212 
14.208.240.200 2000 
14.17.37.143 1993

默認(rèn)情況下,awk以空格作為分隔符號(hào),因此$1將獲取到nginx默認(rèn)格式中的遠(yuǎn)程地址。在這里,我們通過(guò)定義1個(gè)字段,使用ip作為鍵名,如果對(duì)應(yīng)的鍵名存在則將其數(shù)量加1處理。最后我們遍歷這個(gè)字典,之后通過(guò)數(shù)量進(jìn)行排序,最后通過(guò)head獲取10條記錄。
當(dāng)然這種操作方式是有較大誤差的,因?yàn)槲覀儧](méi)有指定狀態(tài)碼等其他條件,下面我們來(lái)看根據(jù)狀態(tài)碼和請(qǐng)求方式這2個(gè)條件后過(guò)濾的數(shù)據(jù):

dog@dog-pc:~$ awk '{if($9>0 && $9==200 && substr($6,2)== "get") a[$1]++}end{for(i in a)print i,a[i]}' nginx.log|sort -t ' ' -k2 -rn|head -n 10 
222.84.160.249 2856 
183.28.6.143 2534 
116.1.127.110 1625 
14.208.240.200 1521 
14.17.37.143 1335 
219.133.40.13 1014 
219.133.40.15 994 
14.17.37.144 988 
14.17.37.161 960 
183.61.51.195 944

這樣我們就可以將這10個(gè)ip進(jìn)行分析,考慮下一步的操作,比如通過(guò)iptables組合禁止該ip的訪問(wèn)或限制其訪問(wèn)的次數(shù)等。

通過(guò)postgresql

通過(guò)postgresql入庫(kù)后使用sql進(jìn)行查詢的方式可以通過(guò)如下2種圖片來(lái)查看:

怎么使用MongoDB分析Nginx日志

在上圖中主要是查看日志中請(qǐng)求狀態(tài)碼的總數(shù)量。而下圖是對(duì)狀態(tài)碼為200的前10條ip的篩選:

怎么使用MongoDB分析Nginx日志

可以看到基本上與上面awk解析的方式一致。

通過(guò)mongodb進(jìn)行查詢

我們知道,mongodb是1個(gè)文檔型數(shù)據(jù)庫(kù),通過(guò)這個(gè)數(shù)據(jù)庫(kù)我們輔助解決關(guān)系型數(shù)據(jù)庫(kù)一些不太擅長(zhǎng)的工作。

在python中,主要的mongodb客戶端驅(qū)動(dòng)是pymongo,我們可以通過(guò)如下的方式建立1個(gè)連接:

in [1]: from pymongo import mongoclient 
in [2]: client = mongoclient()

由于這里我們使用的是默認(rèn)的端口和地址,因此在mongoclient類中不傳入任何的參數(shù)。

在這里,我們先說(shuō)下我們插入到mongodb中日志的格式:

{ 
 "status": 302, //http狀態(tài)碼 
 "addr": "101.226.89.14", //遠(yuǎn)程ip地址 
 "url": "-", 
 "req": "/pocketmoney-2016-xicxcpck.html", //請(qǐng)求的地址 
 "agent": "mozilla/5.0 (linux; android 5.1; oppo r9tm build/lmy47i) applewebkit/537.36 (khtml, like gecko) version/4.0 chrome/37.0.0.0 mobile mqqbrowser/6.2 tbs/036548 safari/537.36 micromessenger/6.3.22.821 nettype/wifi language/zh_cn", //請(qǐng)求的user-agent 
 "referer": "nettype/wifi", 
 "t": "2016/07/10 06:28:32", //請(qǐng)求的時(shí)間 
 "size": 231, //響應(yīng)的大小 
 "method": "get", //請(qǐng)求的方法 
 "user": "-" //用戶名稱 
}

在這里我們通過(guò)python進(jìn)行解析后,組裝成如上的格式后插入到mongodb中,在這里主要用到的是mongodb文檔對(duì)象的insert_one方法插入1條記錄。

db = client['log'] 
col = db['nginx'] 
data = {} 
... 
col.insert_one(data)

接著我們開始對(duì)上述的記錄進(jìn)行查詢操作,主要是通過(guò)mongodb提供的map-reduce來(lái)實(shí)現(xiàn)聚合操作,其對(duì)應(yīng)的python代碼為:

in [3]: db = client['log'] 
in [4]: col = db['nginx'] 
in [5]: pipeline = [ 
 ...: {"$match":{"status":200}}, 
 ...: {"$group":{"_id":"$addr","count":{"$sum":1}}}, 
 ...: {"$sort":{"count":-1}}, 
 ...: {"$limit":10} 
 ...: ] 
in [6]: list(col.aggregate(pipeline)) 
out[6]: 
[{u'_id': u'222.84.160.249', u'count': 2856}, 
 {u'_id': u'183.28.6.143', u'count': 2534}, 
 {u'_id': u'116.1.127.110', u'count': 1625}, 
 {u'_id': u'14.208.240.200', u'count': 1521}, 
 {u'_id': u'14.17.37.143', u'count': 1335}, 
 {u'_id': u'219.133.40.13', u'count': 1014}, 
 {u'_id': u'219.133.40.15', u'count': 994}, 
 {u'_id': u'14.17.37.144', u'count': 988}, 
 {u'_id': u'14.17.37.161', u'count': 960}, 
 {u'_id': u'183.61.51.195', u'count': 944}]

可以看到這個(gè)過(guò)程與之前的2種方式得到的結(jié)果是一致的。

關(guān)于可視化處理

關(guān)于可視化處理,我們可以選擇一些javascript的庫(kù),例如:

  1. 百度的echarts

  2. d3.js及其衍生的庫(kù)

對(duì)于python,可視化處理可以使用如下的一些庫(kù):

  1. matplotlib

  2. pandas

當(dāng)然還有一些其他的庫(kù)這里就不一一敘述了。

下面是1個(gè)使用百度echart繪制的界面:

怎么使用MongoDB分析Nginx日志

到此,關(guān)于“怎么使用MongoDB分析Nginx日志”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

網(wǎng)頁(yè)題目:怎么使用MongoDB分析Nginx日志
網(wǎng)站URL:http://bm7419.com/article20/igecco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google網(wǎng)站導(dǎo)航、動(dòng)態(tài)網(wǎng)站網(wǎng)站內(nèi)鏈、網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開發(fā)