Browse Source

日志文件修复

zhangliang 13 hours ago
parent
commit
8bc63bc508
2 changed files with 57 additions and 38 deletions
  1. 53 34
      core/utils/log/local_log.py
  2. 4 4
      spiders/base_spider.py

+ 53 - 34
core/utils/log/local_log.py

@@ -1,8 +1,6 @@
 import sys
-from datetime import date
+from datetime import datetime
 from pathlib import Path
-
-from loguru._logger import Logger as LoguruLogger
 from loguru import logger as global_logger
 
 from config import settings
@@ -10,58 +8,79 @@ from core.utils.trace_utils import get_current_trace_id
 
 class Local:
     """
-    本地日志记录器
+    本地日志记录器(支持每天自动生成新文件 trace_id 注入)
     """
 
-    _initialized = set()  # 防止重复初始化相同 platform_mode
+    _initialized = set()  # 用于防止同一个 platform+mode 重复初始化
 
     @staticmethod
-    def init_logger(platform: str,
-                    mode: str,
-                    log_level: str = settings.LOG_LEVEL,
-                    log_to_console: bool = False,
-                    rotation: str = "00:00",
-                    retention: str = "10 days") -> LoguruLogger:
+    def init_logger(
+            platform: str,
+            mode: str,
+            log_level: str = "INFO",
+            log_to_console: bool = False,
+            retention: str = "10 days"
+    ):
+        """
+        初始化并返回带上下文的 loguru 日志实例
+
+        :param platform: 平台名(用于日志区分和文件夹名)
+        :param mode: 模式名(用于日志区分)
+        :param log_level: 日志级别(默认 INFO)
+        :param log_to_console: 是否同时输出到控制台
+        :param retention: 日志保留时间(默认 10 天自动清理)
+        :return: 带上下文的 loguru logger
+        """
+
         key = f"{platform}_{mode}"
         if key in Local._initialized:
-            return global_logger  # 已初始化,直接返回
+            # 已初始化相同 platform+mode 时直接返回全局 logger(防止重复初始化导致重复写日志)
+            return global_logger
 
-        # 创建日志目录
-        log_path = Path(f"{settings.LOG_DIR}/{platform}")
-        log_path.mkdir(parents=True, exist_ok=True)
+        # 创建日志存放路径
+        log_dir = Path(f"{settings.LOG_DIR}/{platform}")
+        log_dir.mkdir(parents=True, exist_ok=True)
 
-        # 动态日期
-        current_date = date.today().strftime("%Y-%m-%d")
-        log_filename = f"{platform}-{mode}-{current_date}.log"
-        log_file_path = log_path / log_filename
+        # 按日期命名的日志文件模式,loguru 会每天自动生成新的文件:
+        # 如 yuannifuqimanman-recommend-2025-07-04.log
+        log_pattern = log_dir / f"{platform}-{mode}-{{time:YYYY-MM-DD}}.log"
 
-        # 添加文件日志
+        # 添加文件日志写入
         global_logger.add(
-            str(log_file_path),
+            str(log_pattern),
             level=log_level.upper(),
-            rotation=rotation,
             retention=retention,
-            encoding="utf-8",
-            enqueue=True,
-            backtrace=True,
-            diagnose=True
+            enqueue=True,         # 启用队列异步写入,提高性能
+            encoding="utf-8",     # 避免中文乱码
+            backtrace=True,       # 异常时输出完整堆栈
+            diagnose=True         # 异常时显示变量值
         )
 
         if log_to_console:
+            # 添加控制台输出(可选)
             global_logger.add(
                 sys.stdout,
                 level=log_level.upper(),
-                format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
-                       "<level>{level}</level> | "
-                       "<cyan>{extra[platform]}</cyan> | "
-                       "<cyan>{extra[mode]}</cyan> | "
-                        f"<magenta>trace_id={get_current_trace_id()}</magenta> | "
-                       "{message}"
+                format=(
+                    "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
+                    "<level>{level}</level> | "
+                    "<cyan>{extra[platform]}</cyan> | "
+                    "<cyan>{extra[mode]}</cyan> | "
+                    "<magenta>trace_id={extra[trace_id]}</magenta> | "
+                    "{message}"
+                )
             )
 
-        # 绑定上下文便于日志区分来源
-        logger_with_context = global_logger.bind(platform=platform, mode=mode)
+        # 获取当前 trace_id
+        current_trace_id = get_current_trace_id()
+
+        # 绑定上下文,便于日志区分来源:
+        # trace_id: 当前请求/任务链路唯一标识
+        logger_with_context = global_logger.bind(
+            trace_id=current_trace_id
+        )
 
+        # 防止重复初始化标记
         Local._initialized.add(key)
 
         return logger_with_context

+ 4 - 4
spiders/base_spider.py

@@ -285,10 +285,10 @@ class BaseSpider:
             return True
         async with AsyncMysqlService(self.platform, self.mode) as mysql:
             current_count = await mysql.get_today_videos()
-        if current_count >= max_count:
-            self.logger.info(f"{self.platform} 今日视频数量已达上限: {current_count}")
-            self.aliyun_log.logging(code="1011", message="视频数量达到当日最大值", data=f"<今日视频数量>{current_count}")
-            return False
+            if current_count >= max_count:
+                self.logger.info(f"{self.platform} 今日视频数量已达上限: {current_count}")
+                self.aliyun_log.logging(code="1011", message="视频数量达到当日最大值", data=f"<今日视频数量>{current_count}")
+                return False
         return True
 
     async def _wait_for_next_loop(self, current_loop: int) -> None: