ForcePilot/backend/package/yuxi/utils/logging_config.py
Kris 85b7b265d6 fix(logging): 补全loguru日志格式的extra字段引用
修复日志无法输出bind传入的上下文参数的问题,避免链路排查时丢失异常类型与消息等关键信息
2026-07-09 13:20:42 +08:00

97 lines
2.8 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.

import logging
import os
import sys
from loguru import logger as loguru_logger
from yuxi.utils.datetime_utils import shanghai_now
SAVE_DIR = "saves"
DATETIME = shanghai_now().strftime("%Y-%m-%d")
LOG_FILE = f"{SAVE_DIR}/logs/yuxi-{DATETIME}.log"
class LoguruHandler(logging.Handler):
"""将 Python logging 桥接到 loguru 的 handler"""
def emit(self, record: logging.LogRecord):
level_map = {
logging.DEBUG: "DEBUG",
logging.INFO: "INFO",
logging.WARNING: "WARNING",
logging.ERROR: "ERROR",
logging.CRITICAL: "CRITICAL",
}
level = level_map.get(record.levelno, "DEBUG")
try:
msg = self.format(record)
except Exception:
msg = record.getMessage()
loguru_logger.opt(depth=1, exception=record.exc_info).log(level, msg)
def _setup_logging_bridge():
"""配置 logging 到 loguru 的桥接,捕获第三方库日志"""
loguru_handler = LoguruHandler()
loguru_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
loguru_handler.setFormatter(formatter)
for lib in ["httpx", "openai", "neo4j", "urllib3"]:
lib_logger = logging.getLogger(lib)
lib_logger.addHandler(loguru_handler)
lib_logger.setLevel(logging.WARNING)
lib_logger.propagate = False
def setup_logger(name, level="DEBUG", console=True):
"""使用 loguru 设置日志记录器"""
os.makedirs(f"{SAVE_DIR}/logs", exist_ok=True)
# 移除默认的 handler
loguru_logger.remove()
# 添加文件日志(无颜色)
# 末尾追加 {extra}loguru 会将通过 bind(**kwargs) 传入的附加上下文
# (如 trace_id/error_type/error_message合并到 record 的 extra 字典,
# format 显式引用 {extra} 才能输出,否则 kwargs 会被静默丢弃,导致
# stage 失败、投递失败等错误链路看不到具体异常类型与消息。
loguru_logger.add(
LOG_FILE,
level=level,
format="{time:YYYY-MM-DD HH:mm:ss} - {level} - {file}:{line} - {message} {extra}",
encoding="utf-8",
rotation="10 MB",
retention="30 days",
compression="zip",
enqueue=True,
)
# 添加控制台日志(有颜色)
if console:
loguru_logger.add(
sys.stderr,
level=level,
format=(
"<green>{time:MM-DD HH:mm:ss}</green> "
"<level>{level}</level> "
"<cyan>{file}:{line}</cyan>: "
"<level>{message}</level>"
" {extra}"
),
colorize=True,
enqueue=True,
)
return loguru_logger
# 设置根日志记录器
logger = setup_logger("Yuxi")
# 初始化 logging 桥接
_setup_logging_bridge()
__all__ = ["logger"]