Files
Neo-ZQYY/scripts/ops/_diagnose_member_visit_v3.py

75 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""从 ETL 日志中提取 DWS_MEMBER_VISIT 错误上下文"""
import os, re
from pathlib import Path
from dotenv import load_dotenv
load_dotenv(Path(__file__).resolve().parents[2] / ".env")
LOG_ROOT = os.environ.get("LOG_ROOT")
if not LOG_ROOT:
raise RuntimeError("LOG_ROOT 未设置")
# 找到最近的日志文件
log_dir = Path(LOG_ROOT)
log_file = None
for f in sorted(log_dir.glob("*.log"), key=lambda x: x.stat().st_mtime, reverse=True):
log_file = f
break
if not log_file:
raise RuntimeError(f"{LOG_ROOT} 中未找到日志文件")
print(f"日志文件: {log_file}")
print(f"大小: {log_file.stat().st_size / 1024:.1f} KB")
print("=" * 60)
# 读取日志,找 DWS_MEMBER_VISIT 相关行
with open(log_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
# 找到 MEMBER_VISIT 相关的所有行
visit_lines = []
capture = False
for i, line in enumerate(lines):
if 'MEMBER_VISIT' in line or 'member_visit' in line:
# 取前后 3 行上下文
start = max(0, i - 3)
end = min(len(lines), i + 4)
visit_lines.append((i, lines[start:end]))
if 'uk_dws_member_visit' in line:
start = max(0, i - 5)
end = min(len(lines), i + 6)
visit_lines.append((i, lines[start:end]))
print(f"找到 {len(visit_lines)} 处 MEMBER_VISIT 相关日志")
print()
seen = set()
for line_no, context in visit_lines:
if line_no in seen:
continue
seen.add(line_no)
print(f"--- 行 {line_no + 1} ---")
for l in context:
print(l.rstrip())
print()
# 额外:检查是否有 DETAIL 行PostgreSQL 错误详情)
print("=" * 60)
print("搜索 PostgreSQL 错误详情:")
for i, line in enumerate(lines):
if 'DETAIL' in line and 'member_visit' in lines[max(0, i-5):i+1].__repr__():
print(f"{i+1}: {line.rstrip()}")
if '重复键' in line or 'duplicate key' in line.lower():
print(f"{i+1}: {line.rstrip()}")
# 检查窗口切片信息
print()
print("=" * 60)
print("DWS_MEMBER_VISIT 窗口切片:")
for i, line in enumerate(lines):
if 'DWS_MEMBER_VISIT' in line and ('窗口' in line or 'window' in line.lower() or '切片' in line or '日期范围' in line):
print(f"{i+1}: {line.rstrip()}")
print("\n诊断完成。")