2012-03-05 57 views
2

我是一个尝试使用Python来分析我公司的日志文件的总新手。他们有不同的格式,所以在线日志分析器不能很好地工作。使用Python进行日志分析(访问的主要URL)

的格式如下:

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]" 65 10.184.17.23 10.184.17.23 200 
TCP_NC_MISS 99964 255 GET http://thumbnail.image.example.com 80 
/mall/shop/cabinets/duelmaster/image01.jpg - - - 
DIRECT thumbnail.image.example.com image/jpeg - "Wget/1.12 
(linux-gnu)" OBSERVED "RC_White_list;KC_White_list;Shopping" - 
10.0.201.17 

我想现在要做的主要事情就是抓住所有的CS-主机和CS-URI路径领域,将它们连接在一起(在上面的例子中得到http://thumbnail.image.example.com/mall/shop/cabinets/duelmaster/image01.jpg),计算唯一的实例,并根据访问次数对它们进行排名和吐出,以查看顶级网址。有没有办法使Python像对待单独的对象/列那样处理空格并获取第11个对象,例如?

另一个复杂因素是我们的日志文件很大(〜15GB),理想情况下我希望这可以在20分钟内完成。


尼克拉斯·B.的代码工作很好,我可以打印上的IP,用户等

不幸的是,我不能让程序打印或写外部文件或电子邮件。目前我的代码看起来像这样,只有最后一行被写入文件。可能是什么问题?

为IP,计数heapq.nlargest(K,sourceip.iteritems(),键= itemgetter(1)): 顶= “%d%s的” %(计数,腹膜内)V = 开放( “C:/用户/客户/桌面/日志分析/ urls.txt”, “W”)
打印>> v,顶部

回答

1

是:

from collections import defaultdict 
from operator import itemgetter 

access = defaultdict(int) 

with open("/path/to/file.log", "wb") as f: 
    for line in f: 
    parts = line.split() # split at whitespace 
    access[parts[11] + parts[13]] += 1 # adapt indices here 

# print all URLs in descending order 
for url, count in sorted(access.iteritems(), key=lambda (_, c): -c): 
    print "%d %s" % (count url) 

# if you only want to see the top k entries: 
import heapq 
k = 10 
for url, count in heapq.nlargest(k, access.iteritems(), key=itemgetter(1)): 
    print "%d %s" % (count, url) 

未经测试。另一种可能性是使用Counter

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到一个文件中的问题是,你重新打开在每次迭代的文件,从而丢弃文件的每一次的内容。您应该在循环之外打开文件,并只在里面写入。

+0

谢谢。前k个条目在日志中运行良好,但不是按降序排列(lamba需要第二个参数?)。我现在正在尝试理解该脚本并将其应用于顶级用户,顶级源IP和顶级源IP段,并将其作为每日电子邮件发送给我们的团队。 – Adrienne 2012-03-05 09:13:08

+0

再一次,非常感谢! – Adrienne 2012-03-05 09:13:18

+0

@Adrienne:修正了lambda问题。 – 2012-03-05 15:02:56