You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比单文本文件中含timestamp的行?求Python实现示例

解决日志时间差校验与异常内容输出问题

我来帮你实现这个日志处理的需求,先理清楚核心思路:

  1. 首先得把日志里的时间字符串转换成可计算的datetime对象,这样才能准确计算时间差
  2. 遍历日志时,需要跟踪两个关键变量:上一行的时间戳(用来校验所有相邻行的时间差)和上一条sending publish的时间戳(专门校验这类行的间隔)
  3. 遇到非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:25:01