专栏首页随心DevOps三分钟使用 Python 处理 Nginx 日志

三分钟使用 Python 处理 Nginx 日志

有什么

  • 有 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/python
import sys
import time
format = '%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=SubmitSyncTaskWithData 
HTTP/1.1  
200  
[2003:da8:2004:1000:****:dd8b:00b7:38ae]:8080 
f228d3941798f0d92c877a92a265f679

Python 脚本做了这么几件事:

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

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

彩蛋,结果有了,发给领导? ?

本文分享自微信公众号 - 随心DevOps(heart-devops),作者:临书

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【实战】如何使用 Python 从 Redis 中删除 4000万 KEY

    本文主要涉及 Redis 的以下两个操作和其 Python 实现,目录: SCAN 命令 DEL 命令 使用 Python SCAN 使用 Python DEL...

    临书
  • Django 开发者都应该清楚的 十 个点

    使用 Celery 进行异步任务和 cron 作业(不需要使用 UNIX cron) 开发的前两个星期,你可能不需要将任务放到异步进程中执行,但是当你的非技术...

    临书
  • 你应该使用 Python 管理 Cron 作业

    在本教程中,您将了解 cron 作业的重要性以及为什么需要它们。你可以看一下 python-crontab,这是一个与 crontab 交互的 Python 模...

    临书
  • Ingress 日志,还能这么玩

    最近接到一个需求,需要展示 ingress 上面的访问日志,由于我们的业务系统都部署在 Kubernetes 上面,通过 ingress 进行访问,所以这里的访...

    郭旭东
  • 如何用Python做词云?(基础篇视频教程)

    (由于微信公众号外部链接的限制,文中的部分链接可能无法正确打开。如有需要,请点击文末的“阅读原文”按钮,访问可以正常显示外链的版本。)

    王树义
  • 南京昊绿贲昊玺:作为国内首家稳定同位素源头产品研发商,我们以高质低价打入全球市场 | 镁客请讲

    镁客网
  • Docker实践(七): EFK Stack搭建日志管理系统

    Logstash: 是一个灵活的数据传输和处理系统,Logstash的任务读取原始日志,并对其进行分析和过滤,然后将其转发给其他组件(比如 Elasticsea...

    loong576
  • C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入

            操作系统是ubuntu 18.04.1 server amd64,gcc是 7.3.0。编译产出是64位测试程序。(转载请指明出于breakso...

    方亮
  • 【SPA大赛】LR模型的简单使用教程

    LR 是在线性回归的基础上,套用了一个逻辑函数。 而回归是一种及其简单的模型,我们一个普通的二元函数 y=f(x),就属于回归的一种。它虽然简单,但是它有一个...

    李润凯
  • 怎么分析和展示RNAseq基因表达数据中基因的相关性

    TCGA是癌症基因组分析中相当流行的数据库,针对里面数据的挖掘结果、软件工具发表了许多CNS文章,不过现在已经被整合进GDC数据平台了。虽然现在测序技术发展的很...

    王诗翔呀

扫码关注云+社区

领取腾讯云代金券