diff --git a/src/common/logger.py b/src/common/logger.py
index 4808fc77e..3bab08e6e 100644
--- a/src/common/logger.py
+++ b/src/common/logger.py
@@ -4,7 +4,15 @@ import sys
from types import ModuleType
from pathlib import Path
-# logger.remove()
+# 保存原生处理器ID
+default_handler_id = None
+for handler_id in logger._core.handlers:
+ default_handler_id = handler_id
+ break
+
+# 移除默认处理器
+if default_handler_id is not None:
+ logger.remove(default_handler_id)
# 类型别名
LoguruLogger = logger.__class__
@@ -18,31 +26,54 @@ LOG_ROOT = "logs"
# 默认全局配置
DEFAULT_CONFIG = {
-
# 日志级别配置
- "console_level": "DEBUG", # 控制台默认级别(可覆盖)
- "file_level": "DEBUG", # 文件默认级别(可覆盖)
+ "console_level": "DEBUG",
+ "file_level": "DEBUG",
# 格式配置
"console_format": (
"{time:YYYY-MM-DD HH:mm:ss} | "
"{level: <8} | "
- "{extra[module]: <4} | "
+ "{extra[module]: <12} | "
"{message}"
),
"file_format": (
"{time:YYYY-MM-DD HH:mm:ss} | "
"{level: <8} | "
- "{extra[module]: <20} | "
+ "{extra[module]: <15} | "
"{message}"
),
- "log_dir": LOG_ROOT, # 默认日志目录,需保留
- "rotation": "100 MB", # 设定轮转
- "retention": "7 days", # 设定时长
- "compression": "zip", # 设定压缩
+ "log_dir": LOG_ROOT,
+ "rotation": "00:00",
+ "retention": "3 days",
+ "compression": "zip",
}
+def is_registered_module(record: dict) -> bool:
+ """检查是否为已注册的模块"""
+ return record["extra"].get("module") in _handler_registry
+
+
+def is_unregistered_module(record: dict) -> bool:
+ """检查是否为未注册的模块"""
+ return not is_registered_module(record)
+
+
+def log_patcher(record: dict) -> None:
+ """自动填充未设置模块名的日志记录,保留原生模块名称"""
+ if "module" not in record["extra"]:
+ # 尝试从name中提取模块名
+ module_name = record.get("name", "")
+ if module_name == "":
+ module_name = "root"
+ record["extra"]["module"] = module_name
+
+
+# 应用全局修补器
+logger.configure(patcher=log_patcher)
+
+
class LogConfig:
"""日志配置类"""
@@ -68,7 +99,7 @@ def get_module_logger(
module_name = module if isinstance(module, str) else module.__name__
current_config = config.config if config else DEFAULT_CONFIG
- # 若模块已注册,先移除旧处理器(避免重复添加)
+ # 清理旧处理器
if module_name in _handler_registry:
for handler_id in _handler_registry[module_name]:
logger.remove(handler_id)
@@ -82,16 +113,15 @@ def get_module_logger(
level=console_level or current_config["console_level"],
format=current_config["console_format"],
filter=lambda record: record["extra"].get("module") == module_name,
- enqueue=current_config.get("enqueue", True),
- backtrace=current_config.get("backtrace", False),
- diagnose=current_config.get("diagnose", False),
+ enqueue=True,
)
handler_ids.append(console_id)
# 文件处理器
log_dir = Path(current_config["log_dir"])
log_dir.mkdir(parents=True, exist_ok=True)
- log_file = log_dir / f"{module_name}_{{time:YYYY-MM-DD}}.log"
+ log_file = log_dir / module_name / f"{{time:YYYY-MM-DD}}.log"
+ log_file.parent.mkdir(parents=True, exist_ok=True)
file_id = logger.add(
sink=str(log_file),
@@ -100,9 +130,9 @@ def get_module_logger(
rotation=current_config["rotation"],
retention=current_config["retention"],
compression=current_config["compression"],
- encoding=current_config.get("encoding", "utf-8"),
+ encoding="utf-8",
filter=lambda record: record["extra"].get("module") == module_name,
- enqueue=current_config.get("enqueue", True),
+ enqueue=True,
)
handler_ids.append(file_id)
@@ -124,3 +154,41 @@ def remove_module_logger(module_name: str) -> None:
for handler_id in _handler_registry[module_name]:
logger.remove(handler_id)
del _handler_registry[module_name]
+
+
+# 添加全局默认处理器(只处理未注册模块的日志--->控制台)
+DEFAULT_GLOBAL_HANDLER = logger.add(
+ sink=sys.stderr,
+ level="DEBUG",
+ format=(
+ "{time:YYYY-MM-DD HH:mm:ss} | "
+ "{level: <8} | "
+ "{name: <12} | "
+ "{message}"
+ ),
+ filter=is_unregistered_module, # 只处理未注册模块的日志
+ enqueue=True,
+)
+
+# 添加全局默认文件处理器(只处理未注册模块的日志--->logs文件夹)
+log_dir = Path(DEFAULT_CONFIG["log_dir"])
+log_dir.mkdir(parents=True, exist_ok=True)
+other_log_dir = log_dir / "other"
+other_log_dir.mkdir(parents=True, exist_ok=True)
+
+DEFAULT_FILE_HANDLER = logger.add(
+ sink=str(other_log_dir / f"{{time:YYYY-MM-DD}}.log"),
+ level="DEBUG",
+ format=(
+ "{time:YYYY-MM-DD HH:mm:ss} | "
+ "{level: <8} | "
+ "{name: <15} | "
+ "{message}"
+ ),
+ rotation=DEFAULT_CONFIG["rotation"],
+ retention=DEFAULT_CONFIG["retention"],
+ compression=DEFAULT_CONFIG["compression"],
+ encoding="utf-8",
+ filter=is_unregistered_module, # 只处理未注册模块的日志
+ enqueue=True,
+)