我有一个日志文件,如下所示。试图获取第一个服务器详细信息192.168.1.1
并检查它何时连接和断开连接。然后转到第二个服务器192.168.1.2
详细信息并检查它何时连接和断开连接。像需要确定所有服务器的连接时间和断开连接时间
str_ = '''Jan 23 2016 11:30:08AM - ssh 22 192.168.1.1 connected
Jan 23 2016 12:04:56AM - ssh 22 192.168.1.2 connected
Jan 23 2016 2:18:32PM - ssh 22 192.168.1.2 disconnected
Jan 23 2016 5:16:09PM - un x Dos attack from 201.10.0.4
Jan 23 2016 10:43:44PM - ssh 22 192.168.1.1 disconnected
Feb 1 2016 1:40:28AM - ssh 22 192.168.1.1 connected
Feb 1 2016 2:21:52AM - un x Dos attack from 201.168.123.1
Mar 29 2016 2:13:07PM - ssh 22 192.168.1.1 disconnected'''
如何将我的日志文件转换为 json
我的预期
{1:{192.168.1.1:[(connected,Jan 23 2016 11:30:08AM),(disconnected,Jan 23 2016 10:43:44PM)]},
2:{192.168.1.2:[(connected,Jan 23 2016 12:04:56AM),(disconnected,Jan 23 2016 2:18:32PM)]},
3:{192.168.1.1:[(connected,Feb 1 2016 1:40:28AM),(disconnected,Mar 29 2016 2:13:07PM )]},
4:{Dos:[201.10.0.4,201.168.123.1]}}
我的伪代码
import json
import re
i = 1
result = {}
with open('test.log') as f:
lines = f.readlines()
for line in lines:
r = line.split('')
#result[i] = {}
i += 1
print(result)
with open('data.json', 'w') as fp:
json.dump(result, fp)
- 为什么需要字典由条目编号键控
{1: xxx, 2: yyy, 3: zzz}
?我建议只使用列表 -[xxx, yyy, zzz]
.您可以按索引等获取条目。从技术上讲,json 不能使用数字作为键。 - 没有逻辑可以在伪代码中对连接和断开连接的事件进行分组。
- 日志中的某些行没有连接/断开连接信息,因此您也需要一些逻辑。
-
lines = f.readlines(); for line in lines:
可能会占用大量内存来存储大型日志文件,只需使用for lines in f:
所以,我认为你需要这样的东西:
import json
import re
result = []
opened = {}
with open('test.log') as f:
for line in f:
date, rest = line.split(' - ', 1)
rest, last = rest.strip().rsplit(' ', 1)
ip = rest.rsplit(' ', 1)[1]
if last == 'connected':
entry = {ip: [(last, date)]}
opened[ip] = entry
result.append(entry)
elif last == 'disconnected':
opened[ip][ip].append((last, date))
del opened[ip]
print(result)
with open('data.json', 'w') as fp:
json.dump(result, fp)
它适用于您的示例,但需要对其他日志进行更多错误检查