前一阵子,搭建了ELK日志分析平台,用着挺爽的,再也不用给开发拉各种日志,节省了很多时间。

这篇博文是介绍用python代码实现日志分析的,用MRJob实现hadoop上的mapreduce,可以直接放到hadoop集群上运行。

mrjob可以让我们使用Python编写MapReduce运算,并在多个不同平台运行,你可以:

  • 使用纯python编写multi-step MapReduce
  • 本机测试
  • 在hadoop集群上运行

安装mrjob

pip install mrjob

nginx访问日志格式

gamebbs.51.com 10.80.2.176 219.239.255.42 54220 [26/Dec/2016:04:34:39 +0800] "GET /forum.php?mod=ajax&action=forumchecknew&fid=752&time=1482697523&inajax=yes HTTP/1.0" 200 66 "http://gamebbs.51.com/forum.php?mod=forumdisplay&fid=752&page=1" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2626.106 Safari/537.36 Yunhai Browser" 0.016 0.011

日志格式分为下面几个部分:

server_name(域名): game.51.com
local_ip(本机内网IP):10.80.2.176
client_ip(客户端IP):219.239.255.42
remote_port(客户端建立连接端口):54220
time_local(请求时间):[26/Dec/2016:04:34:39 +0800]
method(请求方式):GET
request(请求url):/forum.php?mod=ajax&action=forumchecknew&fid=752&time=1482697523&inajax=yes HTTP/1.0
verb(http版本号):HTTP/1.0
status(状态码):200
body_bytes_sent:66
http_referer:http://gamebbs.51.com/forum.php?mod=forumdisplay&fid=752&page=1
http_user_agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2626.106 Safari/537.36 Yunhai Browser
request_time:0.016
upstream_response_time:0.011

处理nginx日志的类:

#!/usr/bin/env python
# coding=utf-8 import datetime
from urllib.parse import urlparse
from user_agents import parse as ua_parse class NginxLineParser(object): def parse(self, line):
""" 将 nginx 日志解析多个字段
"""
try:
line_item = line.strip().split('"')
self._server_name, self._local_ip, self._client_ip, self._remote_port = line_item[0].strip().split('[')[0].split()
self._time_local = line_item[0].strip().split('[')[-1].strip(']')
self._method, self._request, self._verb = line_item[1].strip().split()
self._status, self._body_bytes_sent = line_item[2].strip().split()
self._http_referer = line_item[3].strip()
self._http_user_agent = line_item[-2].strip()
self._request_time, self._upstream_response_time = line_item[-1].strip().split()
except:
with open('/tmp/parser_log_error.txt', 'a+') as f:
f.write(line + '\n') def logline_to_dict(self):
""" 将日志段转为字典
"""
line_field = {}
line_field['server_name'] = self.server_name
line_field['local_ip'] = self.local_ip
line_field['client_ip'] = self.client_ip
line_field['remote_port'] = self.remote_port
line_field['time_local'] = self.time_local
line_field['method'] = self.method
line_field['request'] = self.request
line_field['verb'] = self.verb
line_field['status'] = self.status
line_field['body_bytes_sent'] = self.body_bytes_sent
line_field['http_referer'] = self.http_referer
line_field['http_user_agent'] = self.http_user_agent
line_field['request_time'] = self.request_time
line_field['upstream_response_time'] = self.upstream_response_time return line_field @property
def server_name(self):
return self._server_name @property
def local_ip(self):
return self._local_ip @property
def client_ip(self):
return self._client_ip @property
def remote_port(self):
return self._remote_port @property
def time_local(self):
return datetime.datetime.strptime(self._time_local, '%d/%b/%Y:%H:%M:%S +0800') @property
def method(self):
return self._method @property
def request(self):
return urlparse(self._request).path @property
def verb(self):
return self._verb @property
def body_bytes_sent(self):
return self._body_bytes_sent @property
def http_referer(self):
return self._http_referer @property
def http_user_agent(self):
ua_agent = ua_parse(self._http_user_agent)
if not ua_agent.is_bot:
return ua_agent.browser.family @property
def user_agent_type(self):
us_agent = ua_parse(self._http_user_agent)
if us_agent.is_bot:
return us_agent.browser.family @property
def status(self):
return self._status @property
def request_time(self):
return self._request_time @property
def upstream_response_time(self):
return self._upstream_response_time def main():
"""程序执行入口
"""
ng_line_parser = NginxLineParser()
with open('test.log', 'r') as f:
for line in f:
ng_line_parser.parse(line) if __name__ == '__main__':
main()

该类主要有两个方法:

  1. parse:将日志行解析为几个字段
  2. logline_to_dict:将解析好的日志段转为字典类型

一、基于hadoop的nginx访问日志分析---解析日志篇的更多相关文章

  1. 四、基于hadoop的nginx访问日志分析---top 10 request

    代码: # cat top_10_request.py #!/usr/bin/env python # coding=utf-8 from mrjob.job import MRJob from mr ...

  2. 二、基于hadoop的nginx访问日志分析---计算日pv

    代码: # pv_day.py#!/usr/bin/env python # coding=utf-8 from mrjob.job import MRJob from nginx_accesslog ...

  3. 五、基于hadoop的nginx访问日志分析--userAgent和spider

    useragent: 代码(不包含蜘蛛): # cat top_10_useragent.py #!/usr/bin/env python # coding=utf-8 from mrjob.job ...

  4. 三、基于hadoop的nginx访问日志分析--计算时刻pv

    代码: # cat pv_hour.py #!/usr/bin/env python # coding=utf-8 from mrjob.job import MRJob from nginx_acc ...

  5. 快速搭建ELK7.5版本的日志分析系统--搭建篇

    title: 快速搭建ELK7.5版本的日志分析系统--搭建篇 一.ELK安装部署 官网地址:https://www.elastic.co/cn/ 官网权威指南:https://www.elastic ...

  6. 【转】阿里巴巴技术专家杨晓明:基于Hadoop技术进行地理空间分析

    转自:http://www.csdn.net/article/2015-01-23/2823687-geographic-space-base-Hadoop [编者按]交通领域正产生着海量的车辆位置点 ...

  7. 基于ELK进行邮箱访问日志的分析

    公司希望能够搭建自己的日志分析系统.现在基于ELK的技术分析日志的公司越来越多,在此也记录一下我利用ELK搭建的日志分析系统. 系统搭建 系统主要是基于elasticsearch+logstash+f ...

  8. centos7搭建ELK Cluster集群日志分析平台

    应用场景:ELK实际上是三个工具的集合,ElasticSearch + Logstash + Kibana,这三个工具组合形成了一套实用.易用的监控架构, 很多公司利用它来搭建可视化的海量日志分析平台 ...

  9. centos7搭建ELK Cluster集群日志分析平台(一):Elasticsearch

    应用场景: ELK实际上是三个工具的集合,ElasticSearch + Logstash + Kibana,这三个工具组合形成了一套实用.易用的监控架构, 很多公司利用它来搭建可视化的海量日志分析平 ...

随机推荐

  1. SQL SERVER 属性OWNER不可用于数据库xxx。该对象可能没有此属性,也可能是访问权限不足而无法检索。

    今天遇到一个案例:右键单击数据库的属性时出现下面错误提示: 属性Owner不可用于数据库xxx,该对象可能没有此属性,也可能是访问权限不足而无法检索. 使用脚本查看该数据库的Owner时发现Owner ...

  2. Linux启动报错missing operating system

    用UltraISO制作了一个Red Hat Enterprise Linux Server release 5.7系统的U盘启动盘,然后在一台PC上安装,由于安装过程中在干别的事情,有些选项没有细看. ...

  3. JDBC API Description

    package java.sql description What the JDBCTM 4.2 API Includes Versions What the java.sql Package Con ...

  4. FLUSH TABLE WITH READ LOCK详解

    FLUSH TABLES WITH READ LOCK简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与binlog位点匹配).由于FTWRL总共需要持有两把全局的MDL锁,并且还需要关 ...

  5. socket-详细分析No buffer space available

    关键词:socket,tcp三次握手,tcp四次握手,2MSL最大报文生存时间,LVS,负载均衡 新年上班第一天,突然遇到一个socket连接No buffer space available的问题, ...

  6. 使用logminer挖掘日志,分析历史操作 系列一

    ===============STARTED==================================== 事件起因: 业务的人mail过来说是有张表记录的10K+的优惠码记录没了,要我们确 ...

  7. C# 中的var关键字

    var 是3.5新出的一个定义变量的类型 其实也就是弱化类型的定义 VAR可代替任何类型 编译器会根据上下文来判断你到底是想用什么类型的 至于什么情况下用到VAR 我想就是你无法确定自己将用的是什么类 ...

  8. Java.utils.Collections学习

    阅读类库代码是有意义的,尤其是Java集合类框架以及算法Collections Arrays都是值得阅读的, 一来可以减少新手程序员的编码的工作量,二来,对于常见的需求,程序员应该先找下是否有现成的类 ...

  9. Linux下部署docker记录(1)-Volume使用

    之前部署了Linux下部署docker记录(0)-基础环境安装,接下来看看Docker Volume的使用. Docker volume使用1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文 ...

  10. Andrew N.G的机器学习公开课学习笔记(一):机器学习的动机与应用

    机器学习由对于人工智能的研究而来,是一个综合性和应用性学科,可以用来解决计算机视觉/生物学/机器人和日常语言等各个领域的问题,机器学习的目的是让计算机具有像人类的学习能力,这样做是因为我们发现,计算机 ...