From f8a714801be4b29e961baf5258a5e8f79b5f1e3b Mon Sep 17 00:00:00 2001 From: jimi <1847930177@qq.com> Date: Sun, 1 Mar 2026 17:27:20 +0800 Subject: [PATCH] fix: dedupe cs_agent logs and add colored console output --- core/websocket_client.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/core/websocket_client.py b/core/websocket_client.py index 8dd7a85..abc32e3 100755 --- a/core/websocket_client.py +++ b/core/websocket_client.py @@ -29,14 +29,43 @@ def _get_transfer_group(acc_id: str) -> str: return default_group # ========== 日志配置(轮转:按大小 10MB,保留 7 份)========== +class _AnsiColorFormatter(logging.Formatter): + RESET = "\033[0m" + COLORS = { + logging.DEBUG: "\033[36m", # cyan + logging.INFO: "\033[32m", # green + logging.WARNING: "\033[33m", # yellow + logging.ERROR: "\033[31m", # red + logging.CRITICAL: "\033[35m", # magenta + } + + def __init__(self, fmt: str, datefmt: str | None = None, use_color: bool = True): + super().__init__(fmt=fmt, datefmt=datefmt) + self.use_color = use_color + + def format(self, record: logging.LogRecord) -> str: + msg = super().format(record) + if not self.use_color: + return msg + color = self.COLORS.get(record.levelno, "") + if not color: + return msg + return f"{color}{msg}{self.RESET}" + + def setup_logger(): from logging.handlers import RotatingFileHandler from config.config import LOG_DIR, LOG_MAX_BYTES, LOG_BACKUP_COUNT logger = logging.getLogger("cs_agent") + if getattr(logger, "_cs_logger_configured", False): + return logger logger.setLevel(logging.INFO) + # 避免同一日志既被 cs_agent 打印,又向 root logger 传播再打一遍。 + logger.propagate = False fmt = logging.Formatter("[%(asctime)s] %(message)s", datefmt="%H:%M:%S") + use_color = (os.getenv("LOG_COLOR", "1").lower() in ("1", "true", "yes")) and not bool(os.getenv("NO_COLOR")) ch = logging.StreamHandler() - ch.setFormatter(fmt) + ch.setFormatter(_AnsiColorFormatter("[%(asctime)s] %(message)s", datefmt="%H:%M:%S", use_color=use_color)) logger.addHandler(ch) LOG_DIR.mkdir(exist_ok=True) today = datetime.now().strftime("%Y-%m-%d") @@ -48,6 +77,7 @@ def setup_logger(): ) fh.setFormatter(fmt) logger.addHandler(fh) + logger._cs_logger_configured = True return logger import os