全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

本文我们要从日志文件中找出IP访问最多的10条记录,然后判断其是否合法,从而采取对应的措施。感兴趣的朋友们一起来看看吧。

日志解析流程

正常情况下,关于Nginx日志解析的流程如下所示:

一般情况下我们会对要解析的日志提前进行切分,常用的方式是按照日期,然后保存1个星期的日志。然后接下来就是日志的解析了,在这个过程中会使用到一些工具或编程语言,例如awk、grep、perl、python。

最后的入库和可视化处理一般视业务而定,没有强制的要求。

日志查询的解决方案

而关于Nginx日志解析的常用解决方案主要有如下4种方式:

  1. 通过awk和grep进行解析
  2. 通过Postgresql外联表进行日志的映射
  3. 通过Python与MongoDB的组合来进行日志查询
  4. 通过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的库,例如:

  1. 百度的Echarts
  2. d3.js及其衍生的库

对于Python,可视化处理可以使用如下的一些库:

  1. matplotlib
  2. pandas

当然还有一些其他的库这里就不一一叙述了。

下面是1个使用百度Echart绘制的界面:

看起来还是挺漂亮的。

参考文章:http://api.mongodb.com/python/current/examples/aggregation.html

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# mongodb  # 日志分析  # nginx  # 日志分析系统  # Docker mongoDB 4.2.1 安装并收集springboot日志的步骤详解  # MongoDB中4种日志的详细介绍  # 如何利用MongoDB存储Docker日志详解  # MongoDB数据库的日志文件深入分析  # SpringBoot中logback日志保存到mongoDB的方法  # Linux下定时切割Mongodb数据库日志并删除指定天数前的日志记录  # 深入讲解MongoDB的慢日志查询(profile)  # MongoDB运行日志实现自动分割的方法实例  # Node.js和MongoDB实现简单日志分析系统  # MongoDB日志文件过大的解决方法  # 详解MongoDB中的日志模块  # 在这里  # 的是  # 在这个  # 最多  # 其他的  # 情况下  # 可以看到  # 而定  # 过程中  # 主要是  # 文档  # 切分  # 是有  # 多个  # 键名  # 不太  # 遍历  # 感兴趣  # 我们可以  # 朋友们 


相关文章: 外汇网站制作流程,如何在工商银行网站上做外汇买卖?  如何在IIS中新建站点并解决端口绑定冲突?  公众号网站制作网页,微信公众号怎么制作?  建站之星后台密码如何安全设置与找回?  网站网页制作专业公司,怎样制作自己的网页?  如何在宝塔面板创建新站点?  公司网站的制作公司,企业网站制作基本流程有哪些?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  建站之星2.7模板:企业网站建设与h5定制设计专题  建站之星多图banner生成与模板自定义指南  C#如何使用XPathNavigator高效查询XML  建站主机空间推荐 高性价比配置与快速部署方案解析  怎么将XML数据可视化 D3.js加载XML  如何获取开源自助建站系统免费下载链接?  建站之星3.0如何解决常见操作问题?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  建站之星安装需要哪些步骤及注意事项?  如何通过山东自助建站平台快速注册域名?  代刷网站制作软件,别人代刷火车票靠谱吗?  如何高效配置香港服务器实现快速建站?  常州企业网站制作公司,全国继续教育网怎么登录?  c# 服务器GC和工作站GC的区别和设置  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  建站之星ASP如何实现CMS高效搭建与安全管理?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何做静态网页,sublimetext3.0制作静态网页?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  建站之星后台管理:高效配置与模板优化提升用户体验  如何在万网自助建站中设置域名及备案?  如何快速上传建站程序避免常见错误?  网站制作网站,深圳做网站哪家比较好?  如何快速搭建虚拟主机网站?新手必看指南  如何快速搭建个人网站并优化SEO?  如何用PHP快速搭建高效网站?分步指南  如何快速搭建高效服务器建站系统?  平台云上自助建站如何快速打造专业网站?  建站之星在线客服如何快速接入解答?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  大连网站设计制作招聘信息,大连投诉网站有哪些?  南宁网站建设制作定制,南宁网站建设可以定制吗?  平台云上自主建站:模板化设计与智能工具打造高效网站  营销式网站制作方案,销售哪个网站招聘效果最好?  建站之星价格显示格式升级,你的预算足够吗?  如何在万网开始建站?分步指南解析  c++ stringstream用法详解_c++字符串与数字转换利器  SQL查询语句优化的实用方法总结  做企业网站制作流程,企业网站制作基本流程有哪些?  为什么Go需要go mod文件_Go go mod文件作用说明 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。