Python日志解析:提取消息大小并计算均值与标准差
解决方案
你的important列表已经按顺序存储了每一组日志的消息行和字节行(每两个元素为一组:消息行在前,字节行在后)。我们可以用字典来关联每个消息类型对应的所有字节大小,之后用Python内置的statistics模块计算均值和标准差。
步骤说明:
- 初始化字典
message_sizes,键为消息类型(如GENERIC_INFO),值为对应字节大小的列表。 - 按步长2遍历
important列表,每次取一组消息行和字节行。 - 从消息行提取消息类型(索引8),从字节行提取字节数(索引6,转成整数)。
- 将字节数添加到对应消息类型的列表中。
- 最后遍历字典,计算每个消息类型的均值和标准差。
修改后的完整代码:
import statistics logfile = r"C:\Users\vangjeris.dhroso\Documents\Python_Sandbox\Message_log.txt" important = [] keep_phrases = ["Writer", "bytes"] with open(logfile) as f: lines = f.readlines() for line in lines: for phrase in keep_phrases: if phrase in line: important.append(line.split()) break # 关联消息类型和字节大小 message_sizes = {} # 每两个元素为一组:消息行 + 字节行 for i in range(0, len(important), 2): # 提取消息类型(第8位索引) msg_type = important[i][8] # 提取字节大小并转成整数(第6位索引) byte_size = int(important[i+1][6]) # 存入字典 if msg_type not in message_sizes: message_sizes[msg_type] = [] message_sizes[msg_type].append(byte_size) # 计算每个消息类型的均值和标准差 for msg_type, sizes in message_sizes.items(): mean_size = statistics.mean(sizes) # 样本标准差(用stdev),总体标准差用statistics.pstdev() std_dev = statistics.stdev(sizes) print(f"消息类型: {msg_type}") print(f"均值: {mean_size:.2f} bytes") print(f"标准差: {std_dev:.2f} bytes\n")
注意事项:
- 确保日志格式完全符合预期:每一组的消息行(含Writer)后面紧跟字节行(含bytes),否则会出现索引错误。
- 如果日志中有空行或格式异常的行,建议添加
try-except异常处理避免程序崩溃。 statistics.stdev()计算的是样本标准差,若需计算总体标准差(所有数据为全部样本),改用statistics.pstdev()。
内容的提问来源于stack exchange,提问作者Eris Dhroso
相关产品推荐
相关产品推荐

