博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【临实战】使用 Python 处理 Nginx 日志
阅读量:6569 次
发布时间:2019-06-24

本文共 1948 字,大约阅读时间需要 6 分钟。

有什么
  • 有 14 台机器(意味着我们有 14 份日志)
  • 一台可以连到这 14 太机器的机器(有Python 2.6)
要做什么
  • 获取 14 台机器上某时间段内的包含某特征的日志,再取出其中的特定内容
怎么做
  1. 使用 pssh 工具在 14 台机器执行 grep 命令获取包含某特征的日志
  2. 将 14 份日志作为标准输入传给 Python 脚本
  3. Python 解析 stdin(标准输入),将日期转化为 Python 中的日期格式,判断之后将符合条件的特定内容取出并输出到 stdout(标准输出)
开始
一. 使用 pssh 工具在 14 台机器执行 grep 命令获取包含某特征的日志
# 安装 pssh 工具pip install pssh# 使用 pssh 工具pssh -l root -h RS_bj_14.txt -o result "grep some_tag /data/logs/api.log"复制代码
  • -l 的意思是使用哪个用户执行
  • -h 是指定主机列表文件(换行隔开)
  • -o 是指定执行结果保存的文件夹
  • 最后是需要执行的命令
结果:
红色执行失败的的那两台机器未包含符合我们筛选条件的日志
二. 将 14 份日志作为标准输入传给 Python 脚本
14 份日志作为标准输入传给 Python 脚本:
cat result/* | ./ab-result-format.py 15 15 00 10 > result_we_want.log复制代码
Python 脚本
#!/usr/bin/pythonimport sysimport timeformat = '%Y-%m-%dT%H:%M:%S+08:00'h_start = int(sys.argv[1])h_end = int(sys.argv[2])m_start = int(sys.argv[3])m_end = int(sys.argv[4])stdin = sys.stdin.read().strip()line_list = stdin.split('\n')for item in line_list:    infos = item.split()    time_object = time.strptime(infos[0], format)    if h_start <= time_object.tm_hour <= h_end \and m_start <= time_object.tm_min <= m_end:        print infos[8], infos[3], infos[4]复制代码
先交代一下我们分析的日志格式:
Nginx 日志格式(log_format)
为了方便查看,日志格式和日志中的空格都用换行代替
$time_iso8601$remote_addr$host$request_time $upstream_response_time $request $status $upstream_addr$session_id;复制代码
↓↓↓(实际的一条日志)
2017-12-19T00:03:57+08:00 2003:da8:2004:1000:***:ffd2:f0:9b1c [2003:da8:2004:1000:****:ffaa:00f0:9b1c] 0.454 0.448 POST /?Action=SubmitSyncTaskWithDataHTTP/1.1 200 [2003:da8:2004:1000:****:dd8b:00b7:38ae]:8080f228d3941798f0d92c877a92a265f679复制代码
Python 脚本做了这么几件事:
  • 接受 4 个参数,分别是起始的小时和分钟,备用
  • 读取标准输入 sys.stdin.read(),去掉头尾无用的字符 strip(),循环处理每行日志
  • 拆分每行日志 split()
  • 将时间字符串转为时间对象,根据 4 个参数判断小时和分钟(这里处理的比较粗糙,跨小时就没办法处理了,有兴趣的读者可以做的更精细一点)
  • 时间条件符合,打出需要的部分(这里我需要的是 session_id, request_time, upstream_response_time 所以我们print infos[8], infos[3], infos[4]注:Python 的 print 就是标准输出
最后我们使用 >将 Python 脚本的标准输出重定向到 result_we_want.log 文件
彩蛋,结果有了,发给领导?
???,下回我教大家用统计学知识分析结果,求关注

转载地址:http://fzvjo.baihongyu.com/

你可能感兴趣的文章
多线程使用场景
查看>>
keras简单介绍与使用
查看>>
UBI系统原理-中【转】
查看>>
继电器是如何成为CPU的(1)【转】
查看>>
多表一对一左关联
查看>>
关于node.js的进程管理
查看>>
tinymce4.x 上传本地图片(自己写个插件)
查看>>
极客学院职业路径图课程视频下载-爬虫
查看>>
java,使用get、post请求url地址
查看>>
基于Maven构建Web项目
查看>>
Linux下修改Mysql的用户(root)的密码
查看>>
Reactjs 的 PropTypes 使用方法
查看>>
linux开机流程
查看>>
【转载】反向代理为何叫反向代理?
查看>>
Windows 7环境下安装PHP 5.2.17
查看>>
mount(挂载)
查看>>
使用swoole编写简单的echo服务器
查看>>
简明现代魔法博客图书馆之php学习记录
查看>>
深入了解java线程池
查看>>
API接口自动化之2 处理http请求的返回体,对返回体做校验
查看>>