diff --git a/zhenxun/services/log.py b/zhenxun/services/log.py
index 96a45bce..beb2b9c0 100644
--- a/zhenxun/services/log.py
+++ b/zhenxun/services/log.py
@@ -1,4 +1,4 @@
-from datetime import datetime, timedelta
+from datetime import timedelta
from typing import Any, overload
import nonebot
@@ -17,7 +17,7 @@ driver = nonebot.get_driver()
log_level = driver.config.log_level or "INFO"
logger_.add(
- LOG_PATH / f"{datetime.now().date()}.log",
+ LOG_PATH / "{time:YYYY-MM-DD}.log",
level=log_level,
rotation="00:00",
format=default_format,
@@ -26,7 +26,7 @@ logger_.add(
)
logger_.add(
- LOG_PATH / f"error_{datetime.now().date()}.log",
+ LOG_PATH / "error_{time:YYYY-MM-DD}.log",
level="ERROR",
rotation="00:00",
format=default_format,
@@ -36,26 +36,92 @@ logger_.add(
class logger:
- TEMPLATE_A = "Adapter[{}] {}"
- TEMPLATE_B = "Adapter[{}] [{}]: {}"
- TEMPLATE_C = "Adapter[{}] 用户[{}] 触发 [{}]: {}"
- TEMPLATE_D = "Adapter[{}] 群聊[{}] 用户[{}] 触发"
- " [{}]: {}"
- TEMPLATE_E = "Adapter[{}] 群聊[{}] 用户[{}] 触发"
- " [{}] [Target]({}): {}"
-
- TEMPLATE_ADAPTER = "Adapter[{}] "
- TEMPLATE_USER = "用户[{}] "
- TEMPLATE_GROUP = "群聊[{}] "
- TEMPLATE_COMMAND = "CMD[{}] "
- TEMPLATE_PLATFORM = "平台[{}] "
- TEMPLATE_TARGET = "[Target]([{}]) "
+ """
+ 一个经过优化的、支持多种上下文和格式的日志记录器。
+ """
+ TEMPLATE_ADAPTER = "Adapter[{}]"
+ TEMPLATE_USER = "用户[{}]"
+ TEMPLATE_GROUP = "群聊[{}]"
+ TEMPLATE_COMMAND = "CMD[{}]"
+ TEMPLATE_PLATFORM = "平台[{}]"
+ TEMPLATE_TARGET = "[Target]([{}])"
SUCCESS_TEMPLATE = "[{}]: {} | 参数[{}] 返回: [{}]"
- WARNING_TEMPLATE = "[{}]: {}"
+ @classmethod
+ def __parser_template(
+ cls,
+ info: str,
+ command: str | None = None,
+ user_id: int | str | None = None,
+ group_id: int | str | None = None,
+ adapter: str | None = None,
+ target: Any = None,
+ platform: str | None = None,
+ ) -> str:
+ """
+ 优化后的模板解析器,构建并连接日志信息片段。
+ """
+ parts = []
+ if adapter:
+ parts.append(cls.TEMPLATE_ADAPTER.format(adapter))
+ if platform:
+ parts.append(cls.TEMPLATE_PLATFORM.format(platform))
+ if group_id:
+ parts.append(cls.TEMPLATE_GROUP.format(group_id))
+ if user_id:
+ parts.append(cls.TEMPLATE_USER.format(user_id))
+ if command:
+ parts.append(cls.TEMPLATE_COMMAND.format(command))
+ if target:
+ parts.append(cls.TEMPLATE_TARGET.format(target))
- ERROR_TEMPLATE = "[{}]: {}"
+ parts.append(info)
+ return " ".join(parts)
+
+ @classmethod
+ def _log(
+ cls,
+ level: str,
+ info: str,
+ command: str | None = None,
+ session: int | str | Session | uninfoSession | None = None,
+ group_id: int | str | None = None,
+ adapter: str | None = None,
+ target: Any = None,
+ platform: str | None = None,
+ e: Exception | None = None,
+ ):
+ """
+ 核心日志处理方法,处理所有日志级别的通用逻辑。
+ """
+ user_id: str | None = str(session) if isinstance(session, int | str) else None
+
+ if isinstance(session, Session):
+ user_id = session.id1
+ adapter = session.bot_type
+ group_id = f"{session.id3}:{session.id2}" if session.id3 else session.id2
+ platform = platform or session.platform
+ elif isinstance(session, uninfoSession):
+ user_id = session.user.id
+ adapter = session.adapter
+ if session.group:
+ group_id = session.group.id
+ platform = session.basic.get("scope")
+
+ template = cls.__parser_template(
+ info, command, user_id, group_id, adapter, target, platform
+ )
+
+ if e:
+ template += f" || 错误 {type(e).__name__}: {e}"
+
+ try:
+ log_func = getattr(logger_.opt(colors=True), level)
+ log_func(template)
+ except Exception:
+ log_func_fallback = getattr(logger_, level)
+ log_func_fallback(template)
@overload
@classmethod
@@ -70,7 +136,6 @@ class logger:
target: Any = None,
platform: str | None = None,
): ...
-
@overload
@classmethod
def info(
@@ -82,7 +147,6 @@ class logger:
target: Any = None,
platform: str | None = None,
): ...
-
@overload
@classmethod
def info(
@@ -107,28 +171,16 @@ class logger:
target: Any = None,
platform: str | None = None,
):
- user_id: str | None = session # type: ignore
- if isinstance(session, Session):
- user_id = session.id1
- adapter = session.bot_type
- if session.id3:
- group_id = f"{session.id3}:{session.id2}"
- elif session.id2:
- group_id = f"{session.id2}"
- platform = platform or session.platform
- elif isinstance(session, uninfoSession):
- user_id = session.user.id
- adapter = session.adapter
- if session.group:
- group_id = session.group.id
- platform = session.basic["scope"]
- template = cls.__parser_template(
- info, command, user_id, group_id, adapter, target, platform
+ cls._log(
+ "info",
+ info=info,
+ command=command,
+ session=session,
+ group_id=group_id,
+ adapter=adapter,
+ target=target,
+ platform=platform,
)
- try:
- logger_.opt(colors=True).info(template)
- except Exception:
- logger_.info(template)
@classmethod
def success(
@@ -138,9 +190,11 @@ class logger:
param: dict[str, Any] | None = None,
result: str = "",
):
- param_str = ""
- if param:
- param_str = ",".join([f"{k}:{v}" for k, v in param.items()])
+ param_str = (
+ ",".join([f"{k}:{v}" for k, v in param.items()])
+ if param
+ else ""
+ )
logger_.opt(colors=True).success(
cls.SUCCESS_TEMPLATE.format(command, info, param_str, result)
)
@@ -159,7 +213,6 @@ class logger:
platform: str | None = None,
e: Exception | None = None,
): ...
-
@overload
@classmethod
def warning(
@@ -168,12 +221,10 @@ class logger:
command: str | None = None,
*,
session: Session | None = None,
- adapter: str | None = None,
target: Any = None,
platform: str | None = None,
e: Exception | None = None,
): ...
-
@overload
@classmethod
def warning(
@@ -182,7 +233,6 @@ class logger:
command: str | None = None,
*,
session: uninfoSession | None = None,
- adapter: str | None = None,
target: Any = None,
platform: str | None = None,
e: Exception | None = None,
@@ -201,30 +251,17 @@ class logger:
platform: str | None = None,
e: Exception | None = None,
):
- user_id: str | None = session # type: ignore
- if isinstance(session, Session):
- user_id = session.id1
- adapter = session.bot_type
- if session.id3:
- group_id = f"{session.id3}:{session.id2}"
- elif session.id2:
- group_id = f"{session.id2}"
- platform = platform or session.platform
- elif isinstance(session, uninfoSession):
- user_id = session.user.id
- adapter = session.adapter
- if session.group:
- group_id = session.group.id
- platform = session.basic["scope"]
- template = cls.__parser_template(
- info, command, user_id, group_id, adapter, target, platform
+ cls._log(
+ "warning",
+ info=info,
+ command=command,
+ session=session,
+ group_id=group_id,
+ adapter=adapter,
+ target=target,
+ platform=platform,
+ e=e,
)
- if e:
- template += f" || 错误{type(e)}: {e}"
- try:
- logger_.opt(colors=True).warning(template)
- except Exception as e:
- logger_.warning(template)
@overload
@classmethod
@@ -240,7 +277,6 @@ class logger:
platform: str | None = None,
e: Exception | None = None,
): ...
-
@overload
@classmethod
def error(
@@ -253,7 +289,6 @@ class logger:
platform: str | None = None,
e: Exception | None = None,
): ...
-
@overload
@classmethod
def error(
@@ -280,30 +315,17 @@ class logger:
platform: str | None = None,
e: Exception | None = None,
):
- user_id: str | None = session # type: ignore
- if isinstance(session, Session):
- user_id = session.id1
- adapter = session.bot_type
- if session.id3:
- group_id = f"{session.id3}:{session.id2}"
- elif session.id2:
- group_id = f"{session.id2}"
- platform = platform or session.platform
- elif isinstance(session, uninfoSession):
- user_id = session.user.id
- adapter = session.adapter
- if session.group:
- group_id = session.group.id
- platform = session.basic["scope"]
- template = cls.__parser_template(
- info, command, user_id, group_id, adapter, target, platform
+ cls._log(
+ "error",
+ info=info,
+ command=command,
+ session=session,
+ group_id=group_id,
+ adapter=adapter,
+ target=target,
+ platform=platform,
+ e=e,
)
- if e:
- template += f" || 错误 {type(e)}: {e}"
- try:
- logger_.opt(colors=True).error(template)
- except Exception as e:
- logger_.error(template)
@overload
@classmethod
@@ -319,7 +341,6 @@ class logger:
platform: str | None = None,
e: Exception | None = None,
): ...
-
@overload
@classmethod
def debug(
@@ -332,7 +353,6 @@ class logger:
platform: str | None = None,
e: Exception | None = None,
): ...
-
@overload
@classmethod
def debug(
@@ -359,62 +379,78 @@ class logger:
platform: str | None = None,
e: Exception | None = None,
):
- user_id: str | None = session # type: ignore
- if isinstance(session, Session):
- user_id = session.id1
- adapter = session.bot_type
- if session.id3:
- group_id = f"{session.id3}:{session.id2}"
- elif session.id2:
- group_id = f"{session.id2}"
- platform = platform or session.platform
- elif isinstance(session, uninfoSession):
- user_id = session.user.id
- adapter = session.adapter
- if session.group:
- group_id = session.group.id
- platform = session.basic["scope"]
- template = cls.__parser_template(
- info, command, user_id, group_id, adapter, target, platform
+ cls._log(
+ "debug",
+ info=info,
+ command=command,
+ session=session,
+ group_id=group_id,
+ adapter=adapter,
+ target=target,
+ platform=platform,
+ e=e,
)
- if e:
- template += f" || 错误 {type(e)}: {e}"
- try:
- logger_.opt(colors=True).debug(template)
- except Exception as e:
- logger_.debug(template)
+ @overload
@classmethod
- def __parser_template(
+ def trace(
cls,
info: str,
command: str | None = None,
- user_id: int | str | None = None,
+ *,
+ session: int | str | None = None,
group_id: int | str | None = None,
adapter: str | None = None,
target: Any = None,
platform: str | None = None,
- ) -> str:
- arg_list = []
- template = ""
- if adapter is not None:
- template += cls.TEMPLATE_ADAPTER
- arg_list.append(adapter)
- if platform is not None:
- template += cls.TEMPLATE_PLATFORM
- arg_list.append(platform)
- if group_id is not None:
- template += cls.TEMPLATE_GROUP
- arg_list.append(group_id)
- if user_id is not None:
- template += cls.TEMPLATE_USER
- arg_list.append(user_id)
- if command is not None:
- template += cls.TEMPLATE_COMMAND
- arg_list.append(command)
- if target is not None:
- template += cls.TEMPLATE_TARGET
- arg_list.append(target)
- arg_list.append(info)
- template += "{}"
- return template.format(*arg_list)
+ e: Exception | None = None,
+ ): ...
+ @overload
+ @classmethod
+ def trace(
+ cls,
+ info: str,
+ command: str | None = None,
+ *,
+ session: Session | None = None,
+ target: Any = None,
+ platform: str | None = None,
+ e: Exception | None = None,
+ ): ...
+ @overload
+ @classmethod
+ def trace(
+ cls,
+ info: str,
+ command: str | None = None,
+ *,
+ session: uninfoSession | None = None,
+ target: Any = None,
+ platform: str | None = None,
+ e: Exception | None = None,
+ ): ...
+
+ @classmethod
+ def trace(
+ cls,
+ info: str,
+ command: str | None = None,
+ *,
+ session: int | str | Session | uninfoSession | None = None,
+ group_id: int | str | None = None,
+ adapter: str | None = None,
+ target: Any = None,
+ platform: str | None = None,
+ e: Exception | None = None,
+ ):
+ cls._log(
+ "trace",
+ info=info,
+ command=command,
+ session=session,
+ group_id=group_id,
+ adapter=adapter,
+ target=target,
+ platform=platform,
+ e=e,
+ )