logging: 全链路日志与完整异常堆栈
- 新增 logutil:DEBUG 全量滚动日志文件 + 控制台 INFO 简洁输出 + GUI 队列处理器 - providers:每次尝试失败记录 HTTP 状态/响应体,网络异常 logger.exception 留完整堆栈 - pipeline:单任务异常不拖垮整批,缓存命中/阶段耗时/停止过程全程留痕 - CLI/GUI 顶层兜底:未预期异常打印完整 traceback 并指引日志文件;GUI 新增「打开日志」按钮 - 新增 test_logutil(文件落盘/级别过滤/异常堆栈/队列),共 33 个测试全部通过
This commit is contained in:
@@ -2,13 +2,17 @@
|
||||
"""CLI 入口:python -m violation_detector <图片文件夹> [选项]"""
|
||||
import argparse
|
||||
import asyncio
|
||||
import logging
|
||||
import sys
|
||||
|
||||
from . import __version__
|
||||
from .config import DEFAULT_CONFIG, load_config, missing_fields
|
||||
from .logutil import log_file, setup_logging
|
||||
from .pipeline import run_detection
|
||||
from .report import build_report, organize_output
|
||||
|
||||
logger = logging.getLogger("violation_detector.cli")
|
||||
|
||||
|
||||
def build_parser() -> argparse.ArgumentParser:
|
||||
p = argparse.ArgumentParser(
|
||||
@@ -32,6 +36,8 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
|
||||
def main(argv=None) -> int:
|
||||
args = build_parser().parse_args(argv)
|
||||
log_path = setup_logging(console=True)
|
||||
logger.info("商品图合规检测工具 v%s 启动,日志文件:%s", __version__, log_path)
|
||||
cfg = load_config(args.config)
|
||||
if args.prompt:
|
||||
cfg.prompt_file = args.prompt
|
||||
@@ -53,13 +59,25 @@ def main(argv=None) -> int:
|
||||
rows, summary = asyncio.run(run_detection(
|
||||
args.folder, cfg, mode=args.mode, verify=not args.no_verify))
|
||||
except FileNotFoundError as e:
|
||||
print(f"错误:{e}")
|
||||
logger.error("路径或文件不存在:%s", e)
|
||||
return 1
|
||||
except KeyboardInterrupt:
|
||||
logger.warning("用户中断")
|
||||
return 130
|
||||
except Exception: # noqa: BLE001 顶层兜底:完整堆栈进日志与控制台
|
||||
logger.exception("检测过程发生未预期异常")
|
||||
print(f"\n检测失败,完整日志:{log_file()}")
|
||||
return 1
|
||||
|
||||
out_dir = args.output or args.folder
|
||||
ts_dir = organize_output(rows, args.folder, out_dir)
|
||||
xlsx = build_report(rows, str(ts_dir), {"mode": args.mode, **{
|
||||
k: summary.get(k) for k in ("ds_calls", "ds_peak_cost", "ds_idle_cost")}})
|
||||
try:
|
||||
out_dir = args.output or args.folder
|
||||
ts_dir = organize_output(rows, args.folder, out_dir)
|
||||
xlsx = build_report(rows, str(ts_dir), {"mode": args.mode, **{
|
||||
k: summary.get(k) for k in ("ds_calls", "ds_peak_cost", "ds_idle_cost")}})
|
||||
except Exception: # noqa: BLE001
|
||||
logger.exception("输出组织/报表生成失败")
|
||||
print(f"\n报表生成失败,完整日志:{log_file()}")
|
||||
return 1
|
||||
print(f"\n分类输出目录:{ts_dir}")
|
||||
print(f"报表已生成:{xlsx}")
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user