我正在尝试创建一个脚本来解析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初学者。所以我真诚地寻求一些指导/建议。