使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页
使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页
方法1:
linux下使用awk命令
# cat access1.log | awk '{print $1" "$7" "$9}'|sort -n|uniq -c |sort -n -r|head -10

方法2:
通过python处理日志
#encoding=utf-8 # 找到日志中的top 10,日志格式如下
#txt = '''100.116.167.9 - - [22/Oct/2017:03:55:53 +0800] "HEAD /check HTTP/1.0" 200 0 "-" "-" "-" ut = 0.001''' #nodes = txt.split()
#print 'ip:%s, url:%s, code:%s' % (nodes[0],nodes[6],nodes[8]) # 统计ip,url,code的次数,并且生成字典
def log_analysis(log_file, dpath, topn = 10):
path=log_file
shandle = open(path, 'r')
count = 1 log_dict = {} while True:
line = shandle.readline()
if line == '':
break
#print line
nodes = line.split()
#count += 1
#if count >= 10:
# break # {(ip,url,code):count}当做字典的key
#print 'ip:%s, url:%s, code:%s' % (nodes[0],nodes[6],nodes[8]) # 拼凑字典,如果不存在赋值为1,如果存在则+1
ip,url,code = nodes[0],nodes[6],nodes[8]
if (ip, url, code) not in log_dict:
log_dict[(ip, url, code)] = 1
else:
log_dict[(ip, url, code)] = log_dict[(ip, url, code)] + 1
# 关闭文件句柄
shandle.close()
# 对字典进行排序
#print log_dict
# ('111.37.21.148', '/index', '200'): 2
rst_list = log_dict.items()
#print rst_list
#
for j in range(10):
# 冒泡法根据rst_list中的count排序,找出访问量最大的10个IP
for i in range(0,len(rst_list) - 1):
if rst_list[i][1] > rst_list[i+1][1]:
temp = rst_list[i]
rst_list[i] = rst_list[i+1]
rst_list[i+1] = temp need_list = rst_list[-1:-topn - 1:-1]
# 打印出top 10访问日志,并写入网页中
title = 'nginx访问日志'
tbody = ''
for i in need_list:
tbody += '<tr>\n<td>%s</td><td>%s</td><td>%s</td><td>%s</td>\n<tr>\n' % (i[1],i[0][0],i[0][1],i[0][2]) html_tpl = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{title}</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0" color='pink'>
<thead>
<tr cellspacing="0" cellpadding="0">
<th>访问次数</th>
<th>ip</th>
<th>url</th>
<th>http_code</th>
</tr>
</thead>
{tbody}
</table>
</body>
</html>
'''
html_handle = open(dpath,'w')
html_handle.write(html_tpl.format(title = title, tbody = tbody))
html_handle.close() # 函数入口
if __name__ == '__main__':
# nginx日志文件
log_file = 'access1.log'
dpath = 'top10.html'
# topn 表示去top多少个
# 不传,默认10个
topn = 10
# log_analysis(log_file, dpath)
log_analysis(log_file,dpath,topn)

方法2
# 统计nginx日志中的前十名 def static_file(file_name):
res_dict = {}
with open(file_name) as f:
for line in f:
if line == '\n':
continue
# ['100.116.x.x', '-', '-', '[08/Feb/2018:14:37:13', '+0800]', '"HEAD',
# '/check', 'HTTP/1.0"', '200', '0', '"-"', '"-"', '"-"', 'ut', '=', '0.002']
tmp = line.split()
# print(tmp)
tup = (tmp[0],tmp[8])
# 赋值
res_dict[tup] = res_dict.get(tup,0) + 1
return res_dict def generate_html(rst_list):
str_html = '<table border="1" cellpading=0 cellspacing=0>'
str_html += "<tr><th>ip地址</th><th>状态码</th><th>次数</th></tr>"
html_tmpl = '<tr><td>%s</td><td>%s</td><td>%s</td></tr>' for (ip, status),count in rst_list[-20:]:
str_html += html_tmpl % (ip,status,count)
str_html += '</table>'
return str_html def write_to_html(html_list):
with open('res.html', 'w') as f:
f.write(html_list) def main():
res_dict = static_file('voice20180208.log')
res_list = sorted(res_dict.items(), key = lambda x:x[1])
# html_content = generate_html(res_list[-10:])
html_content = generate_html(res_list[-1:-20:-1])
write_to_html(html_content) if __name__ == "__main__":
main()
使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页的更多相关文章
- python 找出一篇文章中出现次数最多的10个单词
#!/usr/bin/python #Filename: readlinepy.py import sys,re urldir=r"C:\python27\a.txt" disto ...
- 查询nginx访问日志中访问次数最多的前10个IP地址
cat log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | awk '{print $0}' | head -n 10
- 【python cookbook】【数据结构与算法】12.找出序列中出现次数最多的元素
问题:找出一个元素序列中出现次数最多的元素是什么 解决方案:collections模块中的Counter类正是为此类问题所设计的.它的一个非常方便的most_common()方法直接告诉你答案. # ...
- nginx访问日志中添加接口返回值
因为nginx作为web服务器时,会代理后端的一些接口,这时访问日志中只能记录访问接口的status码,也就是说,只能获得200.404 这些的值 那么如何获得接口返回的response值呢? 下面开 ...
- nginx日志中访问最多的100个ip及访问次数
nginx日志中访问最多的100个ip及访问次数 awk '{print $1}' /opt/software/nginx/logs/access.log| sort | uniq -c | sort ...
- 【python cookbook】找出序列中出现次数最多的元素
问题 <Python Cookbook>中有这么一个问题,给定一个序列,找出该序列出现次数最多的元素.例如: words = [ 'look', 'into', 'my', 'eyes', ...
- Python找出列表中的最大数和最小数
Python找出列表中数字的最大值和最小值 思路: 先使用冒泡排序将列表中的数字从小到大依次排序 取出数组首元素和尾元素 运行结果: 源代码: 1 ''' 2 4.编写函数,功能:找出多个数中的最大值 ...
- python 找出字符串中出现次数最多的字母
# 请大家找出s=”aabbccddxxxxffff”中 出现次数最多的字母 # 第一种方法,字典方式: s="aabbccddxxxxffff" count ={} for i ...
- FCC JS基础算法题(5):Return Largest Numbers in Arrays(找出多个数组中的最大数)
题目描述: 找出多个数组中的最大数右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组.提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组 ...
随机推荐
- js中得计算问题算式结果拼接成字符串怎么解决
如题:经常遇到类似问题 一种:自定义的弱类型 var savNum=0; var num=$("#numU").val();//jsp页面获得得值 savNum=parseInt( ...
- .Net版微信支付
一. 案例介绍 这里模拟一个实际业务场景,进行介绍微信支付,业务功能包括:登录.注册.充值.查看充值记录. 页面图: 二. 概要设计 1.数据库设计 这里数据库包括两张表:用户表和订单表. ...
- 解决浏览器跨域限制方案之CORS
一.什么是CORS CORS是解决浏览器跨域限制的W3C标准,详见:https://www.w3.org/TR/cors/. 根据CORS标准的定义,在浏览器中访问跨域资源时,需要做如下实现: 服务端 ...
- SQL Server进阶(四):联接-cross join、inner join、left join、right jion、union、union all
测试数据脚本 CREATE TABLE Atable ( S# INT, Sname ), Sage INT, Sfrom ) ) insert into Atable ,N,N'A' union a ...
- C#正则表达式匹配
1.匹配所有带括号的字符串 string s = "aaaa(bbb)ccc(ddd)eeee"; string pattern = "\\(\\w+\\)"; ...
- hadoop1.2.1的安装
前提:1.机器最好都做ssh免密登录,最后在启动hadoop的时候会简单很多 免密登录看免密登录 2.集群中的虚拟机最好都关闭防火墙,否则很麻烦 3集群中的虚拟机中必须安装jdk. 具体安装步骤如下: ...
- MFC中psz_data无法读取内存的错误
1.项目 ->属性->C/C++ -->预编译头文件,改为“不适用预编译头” 出现ATL::CSimplestring错误,psz_data无法读取内存 2.修改如下:鼠标右击 项目 ...
- Python之线程 3 - 信号量、事件、线程队列与concurrent.futures模块
一 信号量 二 事件 三 条件Condition 四 定时器(了解) 五 线程队列 六 标准模块-concurrent.futures 基本方法 ThreadPoolExecutor的简单使用 Pro ...
- ubuntu 18.04/18.10解决create-react-app:command not found问题
npm config set prefix /usr/local sudo npm install -g create-react-app create-react-app my-app
- 🍓 JRoll、React滑动删除 🍓
import React, { Component } from 'react'; import '../src/css/reset.css'; import '../src/css/delete.c ...