您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么使用MongoDB分析Nginx日志”,在日常操作中,相信很多人在怎么使用MongoDB分析Nginx日志問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用MongoDB分析Nginx日志”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
日志解析流程
正常情況下,關于nginx日志解析的流程如下所示:
一般情況下我們會對要解析的日志提前進行切分,常用的方式是按照日期,然后保存1個星期的日志。然后接下來就是日志的解析了,在這個過程中會使用到一些工具或編程語言,例如awk、grep、perl、python。
最后的入庫和可視化處理一般視業務而定,沒有強制的要求。
日志查詢的解決方案
而關于nginx日志解析的常用解決方案主要有如下4種方式:
通過awk和grep進行解析
通過postgresql外聯表進行日志的映射
通過python與mongodb的組合來進行日志查詢
通過elk這個開源套件進行查詢
其中postgresql外聯表的方式在之前公司的時候已經使用過,當然是對公司多個3gb大小的日志進行處理。而第1種和第4種解決方案沒有太多的實踐的經驗,這里我們主要來看第2種解決方案。
日志格式
關于日志解析處理,我們比較常用的方式是使用正則表達式來進行匹配,而常用的1個庫是nginxparser,我們可以直接通過pip進行安裝。當然還有其他的方式來進行解析,這個要視業務而定。
在日志解析中,比較重要的是日志的格式,默認情況下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;
下面我們來看實際業務中的1個應用。之前公司有1個搶微信紅包的活動,當然有用戶反映好幾天都無法搶到1個紅包。因此,我們團隊成員認為可能在這個過程中存在作弊的現象,因此便決定對nginx的日志進行解析。
下面是1條真實的日志的記錄:
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"
日志分析
通過awk進行解析
接著,我們來看下如何使用awk解析出ip訪問最多的記錄,關于awk語法可以參考進行學習:
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
默認情況下,awk以空格作為分隔符號,因此$1將獲取到nginx默認格式中的遠程地址。在這里,我們通過定義1個字段,使用ip作為鍵名,如果對應的鍵名存在則將其數量加1處理。最后我們遍歷這個字典,之后通過數量進行排序,最后通過head獲取10條記錄。
當然這種操作方式是有較大誤差的,因為我們沒有指定狀態碼等其他條件,下面我們來看根據狀態碼和請求方式這2個條件后過濾的數據:
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個ip進行分析,考慮下一步的操作,比如通過iptables組合禁止該ip的訪問或限制其訪問的次數等。
通過postgresql
通過postgresql入庫后使用sql進行查詢的方式可以通過如下2種圖片來查看:
在上圖中主要是查看日志中請求狀態碼的總數量。而下圖是對狀態碼為200的前10條ip的篩選:
可以看到基本上與上面awk解析的方式一致。
通過mongodb進行查詢
我們知道,mongodb是1個文檔型數據庫,通過這個數據庫我們輔助解決關系型數據庫一些不太擅長的工作。
在python中,主要的mongodb客戶端驅動是pymongo,我們可以通過如下的方式建立1個連接:
in [1]: from pymongo import mongoclient in [2]: client = mongoclient()
由于這里我們使用的是默認的端口和地址,因此在mongoclient類中不傳入任何的參數。
在這里,我們先說下我們插入到mongodb中日志的格式:
{ "status": 302, //http狀態碼 "addr": "101.226.89.14", //遠程ip地址 "url": "-", "req": "/pocketmoney-2016-xicxcpck.html", //請求的地址 "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", //請求的user-agent "referer": "nettype/wifi", "t": "2016/07/10 06:28:32", //請求的時間 "size": 231, //響應的大小 "method": "get", //請求的方法 "user": "-" //用戶名稱 }
在這里我們通過python進行解析后,組裝成如上的格式后插入到mongodb中,在這里主要用到的是mongodb文檔對象的insert_one方法插入1條記錄。
db = client['log'] col = db['nginx'] data = {} ... col.insert_one(data)
接著我們開始對上述的記錄進行查詢操作,主要是通過mongodb提供的map-reduce來實現聚合操作,其對應的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}]
可以看到這個過程與之前的2種方式得到的結果是一致的。
關于可視化處理
關于可視化處理,我們可以選擇一些javascript的庫,例如:
百度的echarts
d3.js及其衍生的庫
對于python,可視化處理可以使用如下的一些庫:
matplotlib
pandas
當然還有一些其他的庫這里就不一一敘述了。
下面是1個使用百度echart繪制的界面:
到此,關于“怎么使用MongoDB分析Nginx日志”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。