使用Python进行日志分析(访问的顶级URL)

使用Python进行日志分析(访问的顶级URL),python,text-processing,log-analysis,Python,Text Processing,Log Analysis,我是一个尝试使用Python分析公司日志文件的新手。它们有不同的格式,所以在线日志分析器不能很好地处理它们 格式如下: localtime time-taken x-cs-dns c-ip sc-status s-action sc-bytes cs-bytes cs-method cs-uri-scheme cs-host cs-uri-port cs-uri-path cs-uri-query cs-username cs-auth-group s-hierarchy s-supplier-

我是一个尝试使用Python分析公司日志文件的新手。它们有不同的格式,所以在线日志分析器不能很好地处理它们

格式如下:

localtime time-taken x-cs-dns c-ip sc-status s-action sc-bytes
cs-bytes cs-method cs-uri-scheme cs-host cs-uri-port cs-uri-path
cs-uri-query cs-username cs-auth-group s-hierarchy s-supplier-name
rs(Content-Type) cs(Referer) cs(User-Agent) sc-filter-result
cs-categories x-virus-id s-ip
例如:

“[27/Feb/2012:06:00:01+0900]”6510.184.17.2310.184.17.23200
TCP_NC_MISS 99964 255获取http://thumbnail.image.example.com 80
/商场/商店/橱柜/决斗大师/image01.jpg---
直接缩略图.image.example.com图像/jpeg-“Wget/1.12
(linux gnu)“观察到的”RC_白名单;KC_白名单;购物”-
10.0.201.17
我现在想做的主要事情是获取所有cs主机和cs uri路径字段,将它们连接在一起(以获得
http://thumbnail.image.example.com/mall/shop/cabinets/duelmaster/image01.jpg
在上面的示例中),计算唯一的实例,并根据访问次数对它们进行排序和吐出,以查看最前面的URL。有没有一种方法可以让Python像对待单独的对象/列一样对待空格,并抓取第11个对象

另一个复杂的问题是,我们的日常日志文件非常庞大(~15GB),如果可能的话,我希望这段时间不要超过20分钟


Niklas B.的代码运行良好,我可以打印顶级IP、用户等

不幸的是,我无法让程序打印或写入外部文件或电子邮件。目前,我的代码是这样的,只有最后一行被写入文件。有什么问题吗

对于ip,在heapq.nlargest(k,sourceip.iteritems(),key=itemgetter(1))中计数: top=“%d%s”%(计数,ip)v= 打开(“C:/Users/guest/Desktop/Log analysis/url.txt”、“w”)
打印>>v,顶部

是的:

从集合导入defaultdict
从运算符导入itemgetter
access=defaultdict(int)
将open(“/path/to/file.log”,“wb”)作为f:
对于f中的行:
parts=line.split()#以空格分隔
访问[parts[11]+parts[13]+=1#在此调整索引
#按降序打印所有URL
对于url,按排序计数(access.iteritems(),key=lambda(u,c):-c):
打印“%d%s%”(计数url)
#如果您只想查看前k个条目:
进口heapq
k=10
对于url,在heapq.nlargest(k,access.iteritems(),key=itemgetter(1))中计数:
打印“%d%s%”(计数,url)
未经测试。另一种可能是使用
计数器

from collections import Counter
with open("/path/to/file.log", "wb") as f:
  counter = Counter(''.join(line.split()[11:14:2]) for line in f)

# print top 10 (leave argument out to list all)
for url, count in counter.most_common(10):
  print "%d %s" % (count, url)

顺便说一下,将URL写入文件的代码的问题是,每次迭代都会重新打开文件,因此每次都会丢弃文件的内容。您应该在循环外部打开文件,只在内部写入。

谢谢。前k个条目在日志上运行良好,但不能按降序打印URL(lamba需要第二个参数?)。我现在正试图理解该脚本,并将其改编为顶级用户、顶级源IP和顶级源IP段,并将其作为每日电子邮件发送给我们的团队。@Adrienne:修复了lambda问题。@Adrienne:我只是回顾一下,发现使用
计数器可以更优雅地解决此问题。如果你还感兴趣,我把它作为更新添加了。