From a4ddfcd8ac53b9d48b0ad523e1223c489facfb48 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Mon, 16 Jun 2025 16:03:37 +0800 Subject: [PATCH] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=99=A8=EF=BC=8C=E7=AE=80=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=96=87=E4=BB=B6=E5=91=BD=E5=90=8D=E5=92=8C=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E8=A7=A3=E6=9E=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zhenxun/services/log.py | 332 ++++++++++++++++++++++------------------ 1 file changed, 184 insertions(+), 148 deletions(-) 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, + )