国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

利用MongoDB分析Nginx日志

edgardeng / 577人閱讀

摘要:通過(guò)通過(guò)入庫(kù)后使用進(jìn)行查詢的方式可以通過(guò)如下種圖片來(lái)查看在上圖中主要是查看日志中請(qǐng)求狀態(tài)碼的總數(shù)量。

原文地址:

http://52sox.com/use-mongodb-...

在項(xiàng)目開(kāi)發(fā)過(guò)程中,總是離不開(kāi)日志解析的工作,雖然有些時(shí)候覺(jué)得確實(shí)挺繁瑣的,但是靜下心來(lái)會(huì)發(fā)現(xiàn)有時(shí)候也是挺有趣的1件工作。
在這里,我們要從日志文件中找出IP訪問(wèn)最多的10條記錄,然后判斷其是否合法,從而采取對(duì)應(yīng)的措施。

日志解析流程

正常情況下,關(guān)于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種方式:

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

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

通過(guò)Python與MongoDB的組合來(lái)進(jìn)行日志查詢

通過(guò)ELK這個(gè)開(kāi)源套件進(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)行解析。詳細(xì)內(nèi)容可以點(diǎn)擊優(yōu)化微信紅包搶購(gòu)系統(tǒng)。
下面是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)查看:

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

可以看到基本上與上面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)

接著我們開(kāi)始對(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ù),例如:

百度的Echarts

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

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

matplotlib

pandas

當(dāng)然還有一些其他的庫(kù)這里就不一一敘述了。
下面是1個(gè)使用百度Echart繪制的界面:

看起來(lái)還是挺漂亮的。

參考文章:

http://api.mongodb.com/python...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/39383.html

相關(guān)文章

  • 利用MongoDB分析Nginx日志

    摘要:通過(guò)通過(guò)入庫(kù)后使用進(jìn)行查詢的方式可以通過(guò)如下種圖片來(lái)查看在上圖中主要是查看日志中請(qǐng)求狀態(tài)碼的總數(shù)量。 原文地址: http://52sox.com/use-mongodb-... 在項(xiàng)目開(kāi)發(fā)過(guò)程中,總是離不開(kāi)日志解析的工作,雖然有些時(shí)候覺(jué)得確實(shí)挺繁瑣的,但是靜下心來(lái)會(huì)發(fā)現(xiàn)有時(shí)候也是挺有趣的1件工作。 在這里,我們要從日志文件中找出IP訪問(wèn)最多的10條記錄,然后判斷其是否合法,從而采取...

    LiuZh 評(píng)論0 收藏0
  • 利用MongoDB分析Nginx日志

    摘要:通過(guò)通過(guò)入庫(kù)后使用進(jìn)行查詢的方式可以通過(guò)如下種圖片來(lái)查看在上圖中主要是查看日志中請(qǐng)求狀態(tài)碼的總數(shù)量。 原文地址: http://52sox.com/use-mongodb-... 在項(xiàng)目開(kāi)發(fā)過(guò)程中,總是離不開(kāi)日志解析的工作,雖然有些時(shí)候覺(jué)得確實(shí)挺繁瑣的,但是靜下心來(lái)會(huì)發(fā)現(xiàn)有時(shí)候也是挺有趣的1件工作。 在這里,我們要從日志文件中找出IP訪問(wèn)最多的10條記錄,然后判斷其是否合法,從而采取...

    Ajian 評(píng)論0 收藏0
  • 使用XHProf分析PHP性能瓶頸(二)

    摘要:上一篇文章里,我們介紹了如何基于擴(kuò)展來(lái)分析性能,并記錄到日志里,最后使用擴(kuò)展自帶的在里展示出來(lái)。本次測(cè)試中,實(shí)際使用了擴(kuò)展切換為擴(kuò)展后里看不到數(shù)據(jù),原因未知。雖然來(lái)自但已經(jīng)很久不更新,官方源已經(jīng)顯示此包已廢棄,不再維護(hù)。 上一篇文章里,我們介紹了如何基于xhprof擴(kuò)展來(lái)分析PHP性能,并記錄到日志里,最后使用xhprof擴(kuò)展自帶的UI在web里展示出來(lái)。本篇文章將講述2個(gè)知識(shí)點(diǎn): ...

    Worktile 評(píng)論0 收藏0
  • 從應(yīng)用到平臺(tái) - 云服務(wù)架構(gòu)的演進(jìn)過(guò)程

    摘要:應(yīng)用的研發(fā)上線運(yùn)維運(yùn)營(yíng)形成閉環(huán),順利完成從對(duì)內(nèi)服務(wù)到公共平臺(tái)的升級(jí)。從功能角度,只能支持靜態(tài)方式設(shè)置反向代理,然后,而平臺(tái)有服務(wù)對(duì)應(yīng)的后端服務(wù)和端口是有動(dòng)態(tài)調(diào)整需求。架構(gòu)上是基礎(chǔ)組件需要進(jìn)行升級(jí),數(shù)據(jù)訪問(wèn)層日志監(jiān)控系統(tǒng)等。 介紹 ? ? ? ?MaxLeap早期是一家研發(fā)、運(yùn)營(yíng)移動(dòng)應(yīng)用和手機(jī)游戲公司,發(fā)展過(guò)程中積累了很多通用組件。這些組件很大程度幫公司在移動(dòng)研發(fā)過(guò)程中節(jié)省了時(shí)間和成本,...

    LiangJ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<