#!/usr/bin/env python3 """ 检查最新的 ETL 日志文件,查找 DWD 任务执行情况和错误信息 """ import os import glob from pathlib import Path from datetime import datetime from dotenv import load_dotenv def main(): # 加载环境变量 load_dotenv() log_root = os.environ.get('LOG_ROOT') if not log_root: raise RuntimeError("LOG_ROOT 环境变量未设置") log_dir = Path(log_root) print(f"查找日志目录: {log_dir}") if not log_dir.exists(): print(f"日志目录不存在: {log_dir}") return # 获取所有日志文件并按修改时间排序 log_files = list(log_dir.glob("*.log")) if not log_files: print("未找到日志文件") return # 按修改时间排序,最新的在前 log_files.sort(key=lambda x: x.stat().st_mtime, reverse=True) print(f"找到 {len(log_files)} 个日志文件") print(f"最新日志文件: {log_files[0].name}") print(f"修改时间: {datetime.fromtimestamp(log_files[0].stat().st_mtime)}") # 读取最新日志文件 latest_log = log_files[0] print(f"\n=== 检查最新日志: {latest_log.name} ===") with open(latest_log, 'r', encoding='utf-8') as f: content = f.read() # 查找关键信息 lines = content.split('\n') # 查找 DWD 相关信息 dwd_lines = [line for line in lines if 'DWD' in line] if dwd_lines: print(f"\n🔍 DWD 相关日志 ({len(dwd_lines)} 条):") for line in dwd_lines[-10:]: # 显示最后10条 print(f" {line}") # 查找错误信息 error_lines = [line for line in lines if any(keyword in line.upper() for keyword in ['ERROR', 'EXCEPTION', 'FAILED', 'TRACEBACK'])] if error_lines: print(f"\n❌ 错误信息 ({len(error_lines)} 条):") for line in error_lines[-5:]: # 显示最后5条错误 print(f" {line}") # 查找成功信息 success_lines = [line for line in lines if any(keyword in line.upper() for keyword in ['SUCCESS', 'COMPLETED', 'FINISHED'])] if success_lines: print(f"\n✅ 成功信息 ({len(success_lines)} 条):") for line in success_lines[-5:]: # 显示最后5条成功 print(f" {line}") # 查找数据处理统计 stats_lines = [line for line in lines if any(keyword in line for keyword in ['rows', 'records', 'processed', 'inserted', 'updated'])] if stats_lines: print(f"\n📊 数据处理统计 ({len(stats_lines)} 条):") for line in stats_lines[-5:]: # 显示最后5条统计 print(f" {line}") # 显示日志文件大小和行数 file_size = latest_log.stat().st_size line_count = len(lines) print(f"\n📋 日志文件信息:") print(f" 文件大小: {file_size:,} 字节") print(f" 总行数: {line_count:,} 行") # 如果日志很大,显示最后几行 if line_count > 50: print(f"\n📝 最后 10 行:") for line in lines[-10:]: if line.strip(): print(f" {line}") if __name__ == "__main__": main()