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

如何用Python筛选近24小时日志文件并提取指定内容

解决方案:日志文件筛选与内容提取

问题背景

我需要从路径"F:\\RBS\\python"读取日志文件,该目录下存在多份带日期后缀的日志文件,示例如下:

Nobackupsimage.20230123
Nobackupsimage.20230122
Nobackupsimage.20230120
Nobackupsimage.20230121

当前需要解决两个技术问题:

  1. 仅读取近24小时/8小时内修改的日志文件,并在其中匹配指定模式
  2. 通过正则表达式从日志行中提取服务器名称与任务名称,输出格式示例如下:
delvm126417 bkp.ind.inf.os.unv.ch4..delvm126417.xp2
delvm126410 bkp.ind.inf.os.unv.ch4..delvm126410.xp2
delvm126417 bkp.ind.inf.os.unv.ch4..delvm126417.xp2
delvm126422 bkp.ind.inf.os.unv.ch4..delvm126422.xp2
delvm126498 bkp.ind.inf.os.unv.ch4..delvm126498.xp2

原代码如下:

import re

errors = []
linenum = 0
pattern = re.compile("bkp.ind.inf.", re.IGNORECASE)

with open('F:\\RBS\\python\\Nobackupsimage.20230123.logtxt', 'r') as myfile:
    for line in myfile:
        linenum += 1
        if pattern.search(line) != None:
            errors.append((line.rstrip('\n')))
                   
    print("Below are the total Number of clients having issues, please check and fix:", (len(errors)))
    
    for err in errors:
        print(err)

完整实现代码

import re
import os
import time

# 配置参数
TARGET_DIR = r"F:\RBS\python"
# 时间阈值:8小时改为24*3600即可切换到24小时筛选
TIME_THRESHOLD = 8 * 3600
# 匹配任务名称的正则,同时捕获服务器名部分
TASK_PATTERN = re.compile(r"bkp\.ind\.inf\.os\.unv\.ch4\.\.(\w+)\.xp2", re.IGNORECASE)
# 直接匹配服务器名称的正则(适配日志行中直接出现服务器名的情况)
SERVER_PATTERN = re.compile(r"(delvm\d+)")

def get_recent_files(directory, threshold):
    """获取目录下指定时间内修改的文件"""
    recent_files = []
    current_time = time.time()
    for filename in os.listdir(directory):
        file_path = os.path.join(directory, filename)
        # 只处理文件,跳过子目录
        if os.path.isfile(file_path):
            mtime = os.path.getmtime(file_path)
            # 判断是否在时间阈值范围内
            if current_time - mtime <= threshold:
                recent_files.append(file_path)
    return recent_files

def extract_server_and_task(line):
    """从单条日志行提取服务器名称和任务名称"""
    # 先匹配任务名称
    task_match = TASK_PATTERN.search(line)
    if not task_match:
        return None
    task_name = task_match.group(0)
    
    # 优先从日志行直接匹配服务器名,没有的话从任务名中提取
    server_match = SERVER_PATTERN.search(line)
    server_name = server_match.group(1) if server_match else task_match.group(1)
    
    return (server_name, task_name)

def main():
    recent_files = get_recent_files(TARGET_DIR, TIME_THRESHOLD)
    if not recent_files:
        print("无符合时间要求的日志文件")
        return
    
    results = []
    for file_path in recent_files:
        with open(file_path, 'r', encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                if not line:
                    continue
                # 匹配到目标任务格式就提取信息
                extracted = extract_server_and_task(line)
                if extracted:
                    results.append(extracted)
    
    print(f"共提取到 {len(results)} 条记录:")
    for server, task in results:
        print(f"{server} {task}")

if __name__ == "__main__":
    main()

解决思路说明

针对问题1:筛选最近修改的日志文件

  1. 用os.listdir遍历目标目录的所有条目,只保留文件(排除子文件夹)
  2. 通过os.path.getmtime获取文件最后修改时间的时间戳,和当前时间戳做差值计算,判断是否在设定的8/24小时范围内
  3. 收集所有符合条件的文件路径,后续批量处理

针对问题2:提取服务器和任务名称

  1. 编写精准正则匹配任务名称格式,同时捕获任务名中包含的服务器名部分
  2. 优先从日志行中直接匹配delvm+数字格式的服务器名;如果日志行中没有直接显示,则从任务名的捕获结果中提取
  3. 逐行扫描日志内容,匹配到目标格式就提取信息,最后按要求的空格分隔格式输出

内容的提问来源于stack exchange,提问作者Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:35:22