使用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]的方式来访问数组 ...
随机推荐
- Springboot中Feign的使用总结
Feign是Webservice服务的客户端,创建接口+注解就可完成,实现简单 客户端通过@EnableFeignClients开启Feign的支持功能 @SpringBootApplication ...
- MVC、MVP和MVVC区别
https://blog.csdn.net/victoryzn/article/details/78392128
- vue中axios 配置请求拦截功能 及请求方式如何封装
main.js 中: import axios from '................/axios' axios.js 中: //axios.js import Vue from 'vue' i ...
- 四.HashSet原理及实现学习总结
在上一篇博文(HashMap原理及实现学习总结)详细总结了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素.所以如果对HashMap比 ...
- 【十四】jvm 性能调优实例
实例1: POI Excel 导出 Excel对象很大,多人同时登录系统导出Excel的话,就会有多个大Excel对象到老年代,这是老年代需要回收,系统可能会卡顿. jvm堆内存设置的越大,Full ...
- 最好用的js前端框架、组件、文档在线预览插件
这里收集的都是个人认为比较好的js框架.组件 js前端ui框架 此处列举出个人认为最好的几个框架(排序即排名),现在好点的框架商用都需要付费,以下几个也不例外,但是由于组件丰富,都可以作为企业应用的完 ...
- 执行sql,使用带参的写法
db.ExecuteNonQuery("UPDATE QU_QUALITYREPORT SET RETOSTATUS=1 WHERE BATCHID=@0 AND PROVINCEAREA ...
- pyqt5-QWidget-窗口状态(最大化最小化等)
setWindowState(state) #设置窗口状态 Qt.WindowNoState 无状态-正常状态 Qt.WindowMinimized 最小化 Qt.Wind ...
- CSS公共清除浏览器默认样式
/*Vue隐藏*/ [v-cloak] { display: none; } /*清除样式*/ body, ol, ul, dl, li, dt, dd, h1, h2, h3, h4, h5, h6 ...
- 读书笔记 Facebook在移动端都干了啥,居然让用户爱上广告
文章来源:http://news.cnblogs.com/n/513297/ Facebook武器: Facebook 的武器只有一个:让广告主基于目标用户群投放个性化的精准广告.基于高质量的广告内容 ...