我的任务有点困难。我有一个邮件日志,如:
Oct 3 15:30:18 mail1 postfix/lmtp[5369]: DB10242054: to=<XXXXX>, orig_to=<XXXXXX>, relay=ip[ip]:port, delay=1.4, delays=0.04/0/0.01/1.4, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[iP]:port): 250 2.0.0 Ok: queued as 4580B4208C)
Oct 3 15:30:18 mail1 postfix/smtp[5175]: 4580B4208C: to=<XXXXX>, relay=XXXXX[IP]:port, delay=0.52, delays=0.02/0.01/0.27/0.22, dsn=2.0.0, status=sent (250 2.0.0 OK 1412343018 rr9si6866736lbb - gsmtp)
Oct 3 15:33:57 mail1 amavis[5542]: (05542-09) Passed CLEAN {RelayedInbound}, [ip]:port [ip] <XXXX> -> <XXX>, Message-ID: <XXX>, mail_id: XXXXX, Hits: -1.899, size: 6483, queued_as: 806A24207B, 1483 ms
Oct 3 15:33:57 mail1 postfix/lmtp[6694]: F1FDD41F9D: to=<XXXXXX>, orig_to=<BBBBBB>, relay=ip[ip]:port, delay=1.7, delays=0.18/0/0.01/1.5, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 806A24207B)
我需要打印:
message from:
message to:
sent at:
status:
邮件日志中的一个“事务”有一个唯一的 id,但该 id 可以出现在文件中的不同位置。
我的想法:| ||首先在文件中搜索单个电子邮件地址;
- “保存”新列表中的所有匹配行(这样我就可以迭代较小的列表);
- 我不知道如何解析下一步。 |我的代码现在看起来:
我不要求代码,但是如果您有这样的经验,您能分享一些想法吗?
My code now looks:
lines = []
queue_id = []
f_h = open('/path_to_/maillog', 'r')
def Find_Email(pattern,text):
email = re.search(pattern, text)
if email:
lines.append(text)
q_id = re.search('[A-F0-9]{10}', text)
print text,
if q_id:
queue_id.append(q_id.group())
for line in f_h:
Find_Email(r'[email protected]',line)
I do not ask for code, but could you please share some ideas if you have such experience?
当然,我可以帮助解析 Python 中的邮件日志。对该问题的理解是正确的,关键是根据唯一的邮件 ID 将相关的日志行组合在一起。
以下是处理此问题的方法,包括一些代码示例以说明关键步骤:
1. 使用正则表达式提取数据:
已经开始使用正则表达式,这是正确的方法。创建一个函数,使用正则表达式从日志行中提取必要信息,包括:
-
邮件 ID:
例如
([A-F0-9]{10})
-
发件人:
例如
(?:<)?(.*?)(?:>)?
(在from=
或orig_to=
之后) -
收件人:
例如
(?:<)?(.*?)(?:>)?
(在to=
之后) -
时间戳:
例如
^(\w{3}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})
-
状态:
例如
status=(\w+)
import re
def parse_log_line(line):
"""使用正则表达式解析日志行并返回一个字典。"""
regex = r"(?P<timestamp>\w{3}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})\s+(?P<hostname>\S+)\s+(?P<process>\S+)(\[(?P<pid>\d+)\])?:\s+(?P<message_id>[A-F0-9]{10})?:?\s+(?P<rest>.*)"
match = re.match(regex, line)
if match:
data = match.groupdict()
# 从 'rest' 中提取更多信息,例如发件人、收件人、状态
data['sender'] = re.search(r'orig_to=<(.*?)>', data['rest']).group(1) if 'orig_to' in data['rest'] else None
data['recipient'] = re.search(r'to=<(.*?)>', data['rest']).group(1) if 'to' in data['rest'] else None
data['status'] = re.search(r'status=(\w+)', data['rest']).group(1) if 'status' in data['rest'] else None
return data
return None
2. 使用字典存储邮件数据:
创建一个字典,使用邮件 ID 作为键。每个键的值将是另一个字典,其中包含 "发件人"、"收件人"、"时间戳" 和 "状态" 等信息。
mail_data = {}
3. 迭代日志文件并填充字典:
读取日志文件,逐行解析。对于每条日志行:
- 提取邮件 ID。
-
如果邮件 ID 已存在于
mail_data
字典中,则更新现有条目。 - 否则,使用提取的信息创建一个新条目。
with open('/path_to_/maillog', 'r') as f_h:
for line in f_h:
data = parse_log_line(line)
if data:
message_id = data['message_id']
if message_id:
if message_id in mail_data:
mail_data[message_id].update(data)
else:
mail_data[message_id] = data
4. 打印所需的信息:
迭代
mail_data
字典并以所需格式打印信息。
for message_id, data in mail_data.items():
print(f"Message ID: {message_id}")
print(f" From: {data.get('sender', 'N/A')}")
print(f" To: {data.get('recipient', 'N/A')}")
print(f" Sent at: {data.get('timestamp', 'N/A')}")
print(f" Status: {data.get('status', 'N/A')}")
print("-" * 20)
这将为提供一个结构化的方式来处理邮件日志数据,并轻松地提取和打印需要的信息。
标签:python From: 26282338