如何对比单文本文件中含timestamp的行?求Python实现示例
解决日志时间差校验与异常内容输出问题
我来帮你实现这个日志处理的需求,先理清楚核心思路:
- 首先得把日志里的时间字符串转换成可计算的
datetime对象,这样才能准确计算时间差 - 遍历日志时,需要跟踪两个关键变量:上一行的时间戳(用来校验所有相邻行的时间差)和上一条
sending publish的时间戳(专门校验这类行的间隔) - 遇到非
sending publish的行时,提取括号内的内容输出,同时也要检查它和前后行的时间差是否符合3秒要求
下面是完整的Python代码实现,包含了日志解析、时间校验和异常提示:
from datetime import datetime def process_log_file(file_path): # 定义日志时间的格式,和日志里的格式匹配 time_format = "%a %b %d %H:%M:%S %Y" prev_time = None prev_publish_time = None with open(file_path, 'r') as f: for line_num, line in enumerate(f, 1): line = line.strip() if not line: continue # 跳过空行 # 解析时间戳和内容部分 try: time_str, content_part = line.split(']:(', 1) time_str = time_str.strip('[') current_time = datetime.strptime(time_str, time_format) content = content_part.rstrip(')') # 去掉结尾的括号 except ValueError: print(f"第{line_num}行格式错误,无法解析: {line}") continue # 校验相邻行的时间差(所有行都要检查) if prev_time is not None: time_diff = (current_time - prev_time).total_seconds() if abs(time_diff - 3) > 0.1: # 允许微小的浮点误差 print(f"警告:第{line_num}行与前一行时间差为{time_diff}秒,不符合3秒要求") # 处理sending publish行的时间校验 if content.strip() == "sending publish": if prev_publish_time is not None: publish_diff = (current_time - prev_publish_time).total_seconds() if abs(publish_diff - 3) > 0.1: print(f"警告:第{line_num}行(sending publish)与上一条publish的时间差为{publish_diff}秒,不符合3秒要求") prev_publish_time = current_time else: # 输出非publish行的括号内内容 print(f"第{line_num}行异常内容:{content.strip()}") # 更新上一行时间 prev_time = current_time # 调用示例,替换成你的日志文件路径 if __name__ == "__main__": process_log_file("your_log_file.txt")
代码说明:
- 时间解析:用
datetime.strptime把日志里的时间字符串转换成datetime对象,格式字符串%a %b %d %H:%M:%S %Y完美匹配你的日志时间格式(比如Thu Jan 3 09:28:11 2019) - 时间差校验:用
total_seconds()计算时间差,考虑到浮点精度问题,用abs(time_diff -3) >0.1来判断是否符合3秒要求,避免微小误差导致误判 - 异常处理:加入了格式错误的捕获,避免日志里有非法行导致程序崩溃
- 双时间跟踪:分别跟踪所有行的上一个时间和
sending publish行的上一个时间,满足两种校验需求
用你提供的测试日志运行的话,输出会是:
警告:第4行(sending publish)与上一条publish的时间差为5秒,不符合3秒要求 第3行异常内容:not connect 警告:第5行与前一行时间差为2秒,不符合3秒要求
内容的提问来源于stack exchange,提问作者Nithin Dhruvah
相关产品推荐
相关产品推荐

