"""logging 配置:降级到 stderr,避免污染 stdout(stdout 留给结构化输出如 JSON)。 优先用 jiangchang_skill_core 提供的 logging;本地无该包时降级到 stderr。 """ from __future__ import annotations import logging import sys from util.constants import LOG_LOGGER_NAME, SKILL_SLUG, SKILL_VERSION _configured = False def setup_skill_logging() -> logging.Logger: """初始化 skill logger(幂等)。""" global _configured logger = logging.getLogger(LOG_LOGGER_NAME) if _configured: return logger # 优先用宿主提供的 skill logger 配置 try: from jiangchang_skill_core.logging_config import setup_skill_logging as _host_setup _host_setup(SKILL_SLUG, LOG_LOGGER_NAME) _configured = True return logging.getLogger(LOG_LOGGER_NAME) except ImportError: pass # 本地降级:基础 stderr handler,UTF-8 safe handler = logging.StreamHandler(sys.stderr) handler.setFormatter( logging.Formatter( fmt=f"%(asctime)s [{SKILL_SLUG}] %(levelname)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) ) logger.setLevel(logging.INFO) logger.addHandler(handler) logger.propagate = False _configured = True logger.info("logging initialized (local fallback) v%s", SKILL_VERSION) return logger def get_skill_logger() -> logging.Logger: """获取 skill logger(不会重复 setup)。""" if not _configured: return setup_skill_logging() return logging.getLogger(LOG_LOGGER_NAME)