使用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]的方式来访问数组 ...
随机推荐
- bzoj千题计划314:bzoj3238: [Ahoi2013]差异(后缀数组+st表+单调栈)
https://www.lydsy.com/JudgeOnline/problem.php?id=3238 跟 bzoj3879 差不多 #include<cstdio> #include ...
- springboot(十三):springboot结合mybatis generator逆向工程自动生成代码
错信息generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver 上网查了一下,发现原来是generator这个插件在运 ...
- Java控制台微动画输出 “草泥马神兽”
public static void gameClearance() { String s = "\r ┏┛ ┻━━━━━┛ ┻┓\r ┃ ┃\r ┃ ━ ┃\ ...
- Maven的日常
强烈建议把 Maven 的 settings.xml 文件同时放在:%USER_HOME%/.m2/settings.xml 和${maven.home}/conf/settings.xml 两个地方 ...
- faster rcnn相关内容
转自: https://zhuanlan.zhihu.com/p/31426458 faster rcnn的基本结构 Faster RCNN其实可以分为4个主要内容: Conv layers.作为一种 ...
- luogu P4931 情侣?给我烧了!
双倍经验 传送门 首先坐在一起的cp和不坐在一起的cp是相对独立的,可以分开考虑,然后方案数相乘 坐在一起的cp,方案为\(\binom{n}{k}*\binom{n}{k}*k!*2^k\).首先选 ...
- Flume配置Replicating Channel Selector
1 官网内容 上面的配置是r1获取到的内容会同时复制到c1 c2 c3 三个channel里面 2 详细配置信息 # Name the components on this agent a1.sour ...
- java伪代码 大道至简第一章
import.java.大道至简.*; //一·编程的精义 import.java.编程的精义.*; public class BIANCHENGDEJINGYI { if(愚公死了) 愚公的儿子,孙 ...
- python 的基础学习 第九天 文件的操作
1,文件操作 参数:1,文件路径 2,编码方式,3,执行动作(打开方式),只读,只写,,读写,追加和读写. 1 打开文件,得到文件句柄并赋值给一个变量.2. 通过句柄对文件进行操作.3. 关闭文件 ...
- mysql报错:Cause: com.mysql.jdbc.PacketTooBigException
报错信息: Error updating database. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too ...