用于解析ldap日志以获取Searcches / Binds的Python脚本

时间:2016-12-20 07:57:06

标签: python

我正在尝试创建一个脚本来解析ldap日志并获得每个用户的绑定/搜索次数。让我在下面详细解释问题陈述。

日志文件包含带有BIND REQ和SEARCH REQ的行,只有将这两行连接到会话的常见内容才是连接ID。

每次用户绑定到ldap服务器时,他将获得唯一的连接ID,并且将在日志文件中创建新的BIND REQ行,因此如果用户多次绑定并且每次他将获得多个连接ID 。因此,如果用户test1每天绑定4次,他将拥有4个连接ID,如1234,3345,5643,6642。因此,为了找到用户的No of Binds,我只需要计算连接ID并且我已经完成了

现在,对于每个绑定请求(连接ID),用户可以搜索0次或更多次。因此,为了计算特定用户的搜索次数,首先我必须创建一个字典,其中UID为关键字,连接ID列表为值。然后,对于每个密钥(每个uid),我需要计算每个连接ID的搜索,然后将它们全部加起来以获得最终值。因此,以用户test1的示例为例,计算输出将如下所示

test1-> [1234,3455,5643,6642] - 所以对于绑定所有我需要做的是len(d [test1])

但是对于搜索来说,案例会更棘手......下面就说这些连接ID的搜索行数。

SEARCH REQ.......conn=1234 op=1......
SEARCH REQ.......conn=1234 op=2......
SEARCH REQ.......conn=1234 op=3......
SEARCH REQ.......conn=1234 op=4......
SEARCH REQ.......conn=3345 op=1......
SEARCH REQ.......conn=3345 op=2......
SEARCH REQ.......conn=3345 op=3......
SEARCH REQ.......conn=3345 op=4......
SEARCH REQ.......conn=3345 op=5......
SEARCH REQ.......conn=5643 op=1......
SEARCH REQ.......conn=6642 op=1......
SEARCH REQ.......conn=6642 op=2......
SEARCH REQ.......conn=6642 op=3......

因此结果应该像connid-1234一样计算 - > 4 + connid-3345 - > 5 + connid-5643 - > 1 + connid-6642-> 3

所以test1 = 13

的搜索总数

以下是我的代码,

import os,re,datetime
from collections import defaultdict

d=defaultdict(list)
k=defaultdict(list)
start_time=datetime.datetime.now()

fh = open("C:\\access","r").readlines()
fh1 = open("C:\\access","r").read()
pat=re.compile('conn=([\d]*).*dn=([^,]*)')

for line in fh:
    if re.search(" BIND REQ ",line):
        conid,uid=re.search(pat,line).group(1,2)
        d[uid].append(conid)


for key in d:
    for con in d[key]:
        count = re.findall('SEARCH REQ.*'+con,fh1)
        k[key].append((con,len(count)))


for key in k:
    print("No of bind  ",key," = ",len(k[key]))

for key in k:
    print("Number of searches by ",key, " : ",sum([i[1] for i in k[key]]))

fh.close()
end_time=datetime.datetime.now()
print("Total time taken - {}".format(end_time-start_time))

这个问题是,对于较大的文件说超过20M需要花费很多时间,而且我觉得造成这种情况的代码就在线下

count = re.findall(r'SEARCH REQ.*(?=conn='+con+').*',fh1)

我正在尝试思考并找到一种方法来最小化循环计数,或者可能有更好的方法来做到这一点,我不知道是一个python初学者。所以我真诚地寻求一些指导/建议。

0 个答案:

没有答案