python實(shí)現(xiàn)的分析并統(tǒng)計(jì)nginx日志數(shù)據(jù)功能示例
本文實(shí)例講述了python實(shí)現(xiàn)的分析并統(tǒng)計(jì)nginx日志數(shù)據(jù)功能。分享給大家供大家參考,具體如下:
利用python腳本分析nginx日志內(nèi)容,默認(rèn)統(tǒng)計(jì)ip、訪問url、狀態(tài),可以通過修改腳本統(tǒng)計(jì)分析其他字段。
一、腳本運(yùn)行方式
python count_log.py -f med.xxxx.com.access.log
二、腳本內(nèi)容
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
1.分析日志,每行日志按空格切分,取出需要統(tǒng)計(jì)的相應(yīng)字段,作為字典的key,遍歷相加
2.使用到字典的get方法,通過定義默認(rèn)值,避免miss key的錯(cuò)誤
3.使用列表解析表達(dá)式
4.使用sorted函數(shù)排序列表
5.使用argparse傳入?yún)?shù)
6.nginx日志格式:
log_format access_log
'$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$request_time"' '"$upstream_addr"' '"$upstream_response_time"';
7.日志內(nèi)容:
222.xx.xxx.15 - - [07/Dec/2016:00:03:27 +0800] GET /app/xxx/xxx.apk HTTP/1.0 "304" 0 "-" "Mozilla/5.0 Gecko/20100115 Firefox/3.6" "0.055""-""-"
8.腳本運(yùn)行結(jié)果:
('106.xx.xx.46', '/gateway/xxx/user/mxxxxx/submitSelfTestOfSingleQuestion', '"200"', 299)
('182.1xx.xx.83', '/', '"200"', 185)
('222.xx.1xx.15', '/', '"200"', 152)
('125.xx.2xx.58', '/', '"200"', 145)
"""
import argparse
def count_log(filename, num):
try:
with open(filename) as f:
dic = {}
for l in f:
if not l == '\n': # 判斷空白行
arr = l.split(' ')
ip = arr[0]
url = arr[6]
status = arr[8]
# 字典的key是有多個(gè)元素構(gòu)成的元組
# 字典的get方法,對取的key的值加1,第一次循環(huán)時(shí)由于字典為空指定的key不存在返回默認(rèn)值0,因此讀第一行日志時(shí),統(tǒng)計(jì)結(jié)果為1
dic[(ip, url, status)] = dic.get((ip, url, status), 0) + 1
# 從字典中取出key和value,存在列表中,由于字典的key比較特殊是有多個(gè)元素構(gòu)成的元組,通過索引k[#]的方式取出key的每個(gè)元素
dic_list = [(k[0], k[1], k[2], v) for k, v in dic.items()]
for k in sorted(dic_list, key=lambda x: x[3], reverse=True)[:num]:
print(k)
except Exception as e:
print("open file error:", e)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="傳入日志文件")
# 定義必須傳入日志文件,使用格式-f filename
parser.add_argument('-f', action='store', dest='filename', required=True)
# 通過-n傳入數(shù)值,取出最多的幾行,默認(rèn)取出前10
parser.add_argument('-n', action='store', dest='num', type=int, required=False, default=10)
given_args = parser.parse_args()
filename = given_args.filename
num = given_args.num
count_log(filename, num)
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python日志操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
- Docker構(gòu)建python Flask+ nginx+uwsgi容器
- 淺析python 定時(shí)拆分備份 nginx 日志的方法
- nginx搭建基于python的web環(huán)境的實(shí)現(xiàn)步驟
- python監(jiān)控nginx端口和進(jìn)程狀態(tài)
- Python開發(fā)之Nginx+uWSGI+virtualenv多項(xiàng)目部署教程
- Python運(yùn)維自動化之nginx配置文件對比操作示例
- 詳解python使用Nginx和uWSGI來運(yùn)行Python應(yīng)用
- Python的Flask框架及Nginx實(shí)現(xiàn)靜態(tài)文件訪問限制功能
- 在阿里云服務(wù)器上配置CentOS+Nginx+Python+Flask環(huán)境
- python 檢測nginx服務(wù)郵件報(bào)警的腳本
相關(guān)文章
python實(shí)現(xiàn)Zabbix-API監(jiān)控
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)Zabbix-API監(jiān)控,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
利用python實(shí)現(xiàn)漢字轉(zhuǎn)拼音的2種方法
這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)漢字轉(zhuǎn)拼音的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
在Django中創(chuàng)建URLconf相關(guān)的通用視圖的方法
這篇文章主要介紹了在Django中創(chuàng)建URLconf相關(guān)的通用視圖的方法,Django是Python重多人氣框架中最為著名的一個(gè),需要的朋友可以參考下2015-07-07
教你用python將數(shù)據(jù)寫入Excel文件中
Python作為一種腳本語言相較于shell具有更強(qiáng)大的文件處理能力,下面這篇文章主要給大家介紹了關(guān)于如何用python將數(shù)據(jù)寫入Excel文件中的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
pytorch下大型數(shù)據(jù)集(大型圖片)的導(dǎo)入方式
今天小編就為大家分享一篇pytorch下大型數(shù)據(jù)集(大型圖片)的導(dǎo)入方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
pandas創(chuàng)建新Dataframe并添加多行的實(shí)例
下面小編就為大家分享一篇pandas創(chuàng)建新Dataframe并添加多行的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

