国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > Nginx > 正文

使用MongoDB分析Nginx日志的方法詳解

2024-08-30 12:28:29
字體:
供稿:網(wǎng)友

本文我們要從日志文件中找出IP訪問最多的10條記錄,然后判斷其是否合法,從而采取對(duì)應(yīng)的措施。感興趣的朋友們一起來看看吧。

日志解析流程

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

mongodb,日志分析,nginx,日志分析系統(tǒng)

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

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

日志查詢的解決方案

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

  1. 通過awk和grep進(jìn)行解析
  2. 通過Postgresql外聯(lián)表進(jìn)行日志的映射
  3. 通過Python與MongoDB的組合來進(jìn)行日志查詢
  4. 通過ELK這個(gè)開源套件進(jìn)行查詢

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

日志格式

關(guān)于日志解析處理,我們比較常用的方式是使用正則表達(dá)式來進(jìn)行匹配,而常用的1個(gè)庫(kù)是nginxparser,我們可以直接通過pip進(jìn)行安裝。當(dāng)然還有其他的方式來進(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; 

下面我們來看實(shí)際業(yè)務(wù)中的1個(gè)應(yīng)用。之前公司有1個(gè)搶微信紅包的活動(dòng),當(dāng)然有用戶反映好幾天都無(wú)法搶到1個(gè)紅包。因此,我們團(tuán)隊(duì)成員認(rèn)為可能在這個(gè)過程中存在作弊的現(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" 

日志分析

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

接著,我們來看下如何使用awk解析出IP訪問最多的記錄,關(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)程地址。在這里,我們通過定義1個(gè)字段,使用IP作為鍵名,如果對(duì)應(yīng)的鍵名存在則將其數(shù)量加1處理。最后我們遍歷這個(gè)字典,之后通過數(shù)量進(jìn)行排序,最后通過head獲取10條記錄。
當(dāng)然這種操作方式是有較大誤差的,因?yàn)槲覀儧]有指定狀態(tài)碼等其他條件,下面我們來看根據(jù)狀態(tài)碼和請(qǐng)求方式這2個(gè)條件后過濾的數(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)行分析,考慮下一步的操作,比如通過iptables組合禁止該IP的訪問或限制其訪問的次數(shù)等。

通過Postgresql

通過Postgresql入庫(kù)后使用SQL進(jìn)行查詢的方式可以通過如下2種圖片來查看:

mongodb,日志分析,nginx,日志分析系統(tǒng)

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

mongodb,日志分析,nginx,日志分析系統(tǒng)

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

通過MongoDB進(jìn)行查詢

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

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

In [1]: from pymongo import MongoClient In [2]: client = MongoClient()

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

在這里,我們先說下我們插入到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": "-" //用戶名稱 } 

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

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

接著我們開始對(duì)上述的記錄進(jìn)行查詢操作,主要是通過MongoDB提供的map-reduce來實(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è)過程與之前的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,日志分析系統(tǒng)

看起來還是挺漂亮的。

參考文章:http://api.mongodb/206242.html">mongodb.com/python/current/examples/aggregation.html

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁明县| 兴仁县| 方城县| 八宿县| 浑源县| 东丽区| 阿瓦提县| 奉新县| 渝中区| 吴江市| 牡丹江市| 盖州市| 遂昌县| 清丰县| 安仁县| 瑞金市| 义马市| 襄汾县| 阜康市| 永善县| 荔波县| 陇西县| 白银市| 宜城市| 金秀| 商水县| 军事| 于都县| 日照市| 隆子县| 佳木斯市| 台南市| 宁晋县| 土默特左旗| 宁陕县| 蛟河市| 马尔康县| 邵东县| 孝昌县| 临桂县| 长白|