如何用Python筛选近24小时日志文件并提取指定内容
解决方案:日志文件筛选与内容提取
问题背景
我需要从路径"F:\\RBS\\python"读取日志文件,该目录下存在多份带日期后缀的日志文件,示例如下:
Nobackupsimage.20230123 Nobackupsimage.20230122 Nobackupsimage.20230120 Nobackupsimage.20230121
当前需要解决两个技术问题:
- 仅读取近24小时/8小时内修改的日志文件,并在其中匹配指定模式
- 通过正则表达式从日志行中提取服务器名称与任务名称,输出格式示例如下:
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:筛选最近修改的日志文件
- 用
os.listdir遍历目标目录的所有条目,只保留文件(排除子文件夹) - 通过
os.path.getmtime获取文件最后修改时间的时间戳,和当前时间戳做差值计算,判断是否在设定的8/24小时范围内 - 收集所有符合条件的文件路径,后续批量处理
针对问题2:提取服务器和任务名称
- 编写精准正则匹配任务名称格式,同时捕获任务名中包含的服务器名部分
- 优先从日志行中直接匹配
delvm+数字格式的服务器名;如果日志行中没有直接显示,则从任务名的捕获结果中提取 - 逐行扫描日志内容,匹配到目标格式就提取信息,最后按要求的空格分隔格式输出
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

