62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""详细分析 v8 日志,提取所有任务状态。"""
|
||
import json
|
||
import re
|
||
from pathlib import Path
|
||
from dotenv import load_dotenv
|
||
|
||
load_dotenv(Path(__file__).resolve().parents[2] / ".env")
|
||
from _env_paths import get_output_path
|
||
|
||
log_dir = get_output_path("SYSTEM_LOG_ROOT")
|
||
raw = json.loads((log_dir / "2026-02-21__etl_run_raw_v8.json").read_text("utf-8"))
|
||
|
||
error_log = raw.get("error_log", "")
|
||
output_log = raw.get("output_log", "")
|
||
full = output_log + "\n" + error_log
|
||
|
||
# 更宽泛的匹配
|
||
success_pat = re.compile(r"任务\s+(\S+)\s+执行成功")
|
||
fail_pat = re.compile(r"任务\s+(\S+)\s+失败")
|
||
complete_pat = re.compile(r"(\S+)\s*(?:完成|成功|✅)")
|
||
|
||
# 查找所有提到的任务
|
||
task_pat = re.compile(r"(ODS_FETCH|DWD_LOAD_FROM_ODS|DWS_\w+)")
|
||
all_tasks = set(task_pat.findall(full))
|
||
|
||
print("=== 日志中出现的所有任务 ===")
|
||
for t in sorted(all_tasks):
|
||
print(f" {t}")
|
||
|
||
print(f"\n=== 成功匹配 ===")
|
||
for m in success_pat.finditer(full):
|
||
print(f" ✅ {m.group(1)}")
|
||
|
||
print(f"\n=== 失败匹配 ===")
|
||
for m in fail_pat.finditer(full):
|
||
print(f" ❌ {m.group(1)}")
|
||
|
||
# 查找 DWD 装载详情
|
||
dwd_pat = re.compile(r"DWD 装载(成功|失败):(\S+?),用时 ([\d.]+)s(?:,err=(.*))?")
|
||
print(f"\n=== DWD 装载详情 ===")
|
||
dwd_success = 0
|
||
dwd_fail = 0
|
||
for m in dwd_pat.finditer(full):
|
||
status, table, dur, err = m.groups()
|
||
icon = "✅" if status == "成功" else "❌"
|
||
if status == "成功":
|
||
dwd_success += 1
|
||
else:
|
||
dwd_fail += 1
|
||
line = f" {icon} {table} ({dur}s)"
|
||
if err:
|
||
line += f" — {err[:80]}"
|
||
print(line)
|
||
print(f" 合计: {dwd_success} 成功, {dwd_fail} 失败")
|
||
|
||
# 查找 year -1 相关上下文
|
||
print(f"\n=== 'year -1' 相关行 ===")
|
||
for line in full.split("\n"):
|
||
if "year" in line.lower() and ("-1" in line or "out of range" in line):
|
||
print(f" {line.strip()[:200]}")
|