Browse Source

日志拆分

luojunhui 6 days ago
parent
commit
64ee7787dd

+ 6 - 3
server.toml

@@ -1,6 +1,9 @@
 reload = true
 bind = "0.0.0.0:7800"
 workers = 1
-keep_alive_timeout = 120  # 保持连接的最大秒数,根据需要调整
-graceful_timeout = 300    # 重启或停止之前等待当前工作完成的时间
-loglevel = "warning"  # 日志级别
+keep_alive_timeout = 120
+graceful_timeout = 300
+loglevel = "warning"
+# Hypercorn 自身日志分文件
+accesslog = "logs/hypercorn_access.log"
+errorlog = "logs/hypercorn_error.log"

+ 160 - 0
src/config/logging_config.py

@@ -0,0 +1,160 @@
+"""应用日志配置 —— 按功能模块分文件输出,带轮转防爆盘"""
+
+import logging
+import logging.config
+import os
+from pathlib import Path
+
+PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent
+LOG_DIR = PROJECT_ROOT / "logs"
+
+
+def _log(name: str) -> str:
+    return str(LOG_DIR / f"{name}.log")
+
+
+LOGGING_CONFIG: dict = {
+    "version": 1,
+    "disable_existing_loggers": False,
+    "formatters": {
+        "default": {
+            "format": "%(asctime)s | %(levelname)-5s | %(name)s | %(message)s",
+            "datefmt": "%Y-%m-%d %H:%M:%S",
+        },
+        "brief": {
+            "format": "%(asctime)s | %(levelname)-5s | %(message)s",
+            "datefmt": "%H:%M:%S",
+        },
+    },
+    "handlers": {
+        # ── 按功能分文件 ──
+        "handler_article": {
+            "class": "logging.handlers.RotatingFileHandler",
+            "filename": _log("handler_article"),
+            "maxBytes": 10 * 1024 * 1024,
+            "backupCount": 3,
+            "formatter": "default",
+            "encoding": "utf-8",
+        },
+        "handler_account": {
+            "class": "logging.handlers.RotatingFileHandler",
+            "filename": _log("handler_account"),
+            "maxBytes": 10 * 1024 * 1024,
+            "backupCount": 3,
+            "formatter": "default",
+            "encoding": "utf-8",
+        },
+        "handler_enqueue": {
+            "class": "logging.handlers.RotatingFileHandler",
+            "filename": _log("handler_enqueue"),
+            "maxBytes": 10 * 1024 * 1024,
+            "backupCount": 3,
+            "formatter": "default",
+            "encoding": "utf-8",
+        },
+        "domain_supply": {
+            "class": "logging.handlers.RotatingFileHandler",
+            "filename": _log("domain_content_supply"),
+            "maxBytes": 10 * 1024 * 1024,
+            "backupCount": 3,
+            "formatter": "default",
+            "encoding": "utf-8",
+        },
+        "domain_enqueue": {
+            "class": "logging.handlers.RotatingFileHandler",
+            "filename": _log("domain_enqueue_task"),
+            "maxBytes": 10 * 1024 * 1024,
+            "backupCount": 3,
+            "formatter": "default",
+            "encoding": "utf-8",
+        },
+        "infra": {
+            "class": "logging.handlers.RotatingFileHandler",
+            "filename": _log("infra"),
+            "maxBytes": 10 * 1024 * 1024,
+            "backupCount": 3,
+            "formatter": "default",
+            "encoding": "utf-8",
+        },
+        "server": {
+            "class": "logging.handlers.RotatingFileHandler",
+            "filename": _log("server"),
+            "maxBytes": 10 * 1024 * 1024,
+            "backupCount": 3,
+            "formatter": "default",
+            "encoding": "utf-8",
+        },
+        # ── 控制台(开发时保留)──
+        "console": {
+            "class": "logging.StreamHandler",
+            "formatter": "brief",
+        },
+    },
+    "loggers": {
+        # handler — 按业务功能分 3 组
+        "src.handlers.article_search": {
+            "handlers": ["handler_article", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+        "src.handlers.article_fetch_detail": {
+            "handlers": ["handler_article", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+        "src.handlers.account_fetch": {
+            "handlers": ["handler_account", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+        "src.handlers.account_article_fetch": {
+            "handlers": ["handler_account", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+        "src.handlers.account_article_update": {
+            "handlers": ["handler_account", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+        "src.handlers.demand_enqueue": {
+            "handlers": ["handler_enqueue", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+        # domain
+        "src.domains.content_supply": {
+            "handlers": ["domain_supply", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+        "src.domains.demand_enqueue_task": {
+            "handlers": ["domain_enqueue", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+        # infra
+        "src.infra": {
+            "handlers": ["infra", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+        # server
+        "src.server": {
+            "handlers": ["server", "console"],
+            "level": "INFO",
+            "propagate": False,
+        },
+    },
+    # root — 兜底,未匹配的日志走这里
+    "root": {
+        "handlers": ["console"],
+        "level": "WARNING",
+    },
+}
+
+
+def setup_logging() -> None:
+    """初始化应用日志配置,自动创建 logs/ 目录"""
+    os.makedirs(LOG_DIR, exist_ok=True)
+    logging.config.dictConfig(LOGGING_CONFIG)

+ 3 - 0
src/domains/content_decode/__init__.py

@@ -0,0 +1,3 @@
+"""
+供给文章解构模块
+"""

+ 3 - 0
src/domains/content_quality/__init__.py

@@ -0,0 +1,3 @@
+"""
+文章质量指标
+"""

+ 2 - 0
src/server/app.py

@@ -10,6 +10,7 @@ from src.config import GlobalConfig
 from src.infra.database import DatabaseManager, create_backend
 from src.infra.observability import LogService
 from src.infra.xxl_jobs import XxlJobExecutor
+from src.config.logging_config import setup_logging
 from src.handlers import discover_and_register
 from src.handlers._utils import set_db
 from src.server.xxl_endpoints import set_xxl_executor
@@ -30,6 +31,7 @@ def create_app(global_config: GlobalConfig = None) -> Quart:
         global_config = GlobalConfig()
 
     logging.basicConfig(level=logging.INFO)
+    setup_logging()
 
     # 初始化各层依赖 —— 全部从 global_config 取值
     log_service = LogService(global_config.aliyun_log)