五分钟系列:Python 处理Nginx日志

服务器
时间条件符合,打出需要的部分(这里我需要的是 session_id, request_time, upstream_response_time 所以我们print infos, infos, infos注:Python 的 print 就是标准输出。

有什么

  • 有 14 台机器(意味着我们有 14 份日志)
  • 一台可以连到这 14 太机器的机器(有Python 2.6)

要做什么

  • 获取 14 台机器上某时间段内的包含某特征的日志,再取出其中的特定内容

怎么做

  1. 使用 pssh 工具在 14 台机器执行 grep 命令获取包含某特征的日志
  2. 将 14 份日志作为标准输入传给 Python 脚本
  3. Python 解析 stdin(标准输入),将日期转化为 Python 中的日期格式,判断之后将符合条件的特定内容取出并输出到 stdout(标准输出)

开始

一. 使用 pssh 工具在 14 台机器执行 grep 命令获取包含某特征的日志

  1. # 安装 pssh 工具 
  2. pip install pssh 
  3. # 使用 pssh 工具 
  4. pssh -l root -h RS_bj_14.txt -o result "grep some_tag /data/logs/api.log" 
  • -l 的意思是使用哪个用户执行
  • -h 是指定主机列表文件(换行隔开)
  • -o 是指定执行结果保存的文件夹
  • ***是需要执行的命令

结果:

红色执行失败的的那两台机器未包含符合我们筛选条件的日志

二. 将 14 份日志作为标准输入传给 Python 脚本

14 份日志作为标准输入传给 Python 脚本:

  1. cat result/* | ./ab-result-format.py 15 15 00 10 > result_we_want.log 

Python 脚本

  1. #!/usr/bin/python 
  2. import sys 
  3. import time 
  4.  
  5. format = '%Y-%m-%dT%H:%M:%S+08:00' 
  6.  
  7. h_start = int(sys.argv[1]) 
  8. h_end = int(sys.argv[2]) 
  9. m_start = int(sys.argv[3]) 
  10. m_end = int(sys.argv[4]) 
  11.  
  12. stdin = sys.stdin.read().strip() 
  13. line_list = stdin.split('\n'
  14. for item in line_list: 
  15.     infos = item.split() 
  16.     time_object = time.strptime(infos[0], format) 
  17.     if h_start <= time_object.tm_hour <= h_end \ 
  18. and m_start <= time_object.tm_min <= m_end: 
  19.         print infos[8], infos[3], infos[4] 

先交代一下我们分析的日志格式:

Nginx 日志格式(log_format)

为了方便查看,日志格式和日志中的空格都用换行代替

  1. $time_iso8601 
  2. $remote_addr 
  3. $host 
  4. $request_time  
  5. $upstream_response_time  
  6. $request  
  7. $status  
  8. $upstream_addr 
  9. $session_id; 

(实际的一条日志)

  1. 2017-12-19T00:03:57+08:00  
  2. 2003:da8:2004:1000:a0a:ffd2:f0:9b1c  
  3. [2003:da8:2004:1000:0a13:ffaa:00f0:9b1c]  
  4. 0.454  
  5. 0.448  
  6. POST  
  7. /?Action=SubmitSyncTaskWithData 
  8. HTTP/1.1  
  9. 200  
  10. [2003:da8:2004:1000:****:dd8b:00b7:38ae]:8080 
  11. f228d3941798f0d92c877a92a265f679 

Python 脚本做了这么几件事:

  • 接受 4 个参数,分别是起始的小时和分钟,备用
  • 读取标准输入 sys.stdin.read(),去掉头尾无用的字符 strip(),循环处理每行日志
  • 拆分每行日志 split()
  • 将时间字符串专为时间对象,根据 4 个参数判断小时和分钟(这里处理的比较粗糙,跨小时就没办法处理了,有兴趣的读者可以做的更精细一点)
  • 时间条件符合,打出需要的部分(这里我需要的是 session_id, request_time, upstream_response_time 所以我们print infos, infos, infos注:Python 的 print 就是标准输出

***我们使用 >将 Python 脚本的标准输出重定向到 result_we_want.log 文件

责任编辑:武晓燕 来源: zhuanlan
相关推荐

2018-01-16 10:11:11

Nginx访问日志

2024-07-10 18:55:09

Python定时

2011-08-08 09:22:10

Python

2009-11-16 10:53:30

Oracle Hint

2020-06-16 08:47:53

磁盘

2024-07-12 14:21:32

Python编码

2021-06-07 09:51:22

原型模式序列化

2019-08-09 10:33:36

开发技能代码

2009-10-22 16:18:19

Oracle表空间

2024-09-18 08:21:24

JavaScriptTypeScriptprototype

2021-10-19 07:27:08

HTTP代理网络

2009-11-05 14:53:54

Visual Stud

2022-12-16 09:55:50

网络架构OSI

2009-11-16 09:53:56

PHP上传类

2023-09-07 23:52:50

Flink代码

2023-07-23 18:47:59

Docker开源

2009-11-17 14:50:50

Oracle调优

2021-12-01 06:50:50

Docker底层原理

2024-07-03 15:00:00

变量命名Python编程

2022-05-30 08:34:49

PythonSQL
点赞
收藏

51CTO技术栈公众号