From e52307f5b5cfd9ac647f85b71269741f75d7a777 Mon Sep 17 00:00:00 2001 From: KimigaiiWuyi <444835641@qq.com> Date: Mon, 16 Jun 2025 18:43:03 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=E6=96=B0=E5=A2=9E=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E9=85=8D=E7=BD=AE,=20=E4=BF=AE=E5=A4=8D=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E7=9B=B8=E5=85=B3=E7=9A=84BUG=20(#131)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gsuid_core/bot.py | 2 +- gsuid_core/config.py | 1 + gsuid_core/handler.py | 5 ++- gsuid_core/logger.py | 40 ++++++++----------- gsuid_core/utils/backup/backup_files.py | 4 +- .../utils/plugins_config/config_default.py | 5 --- gsuid_core/utils/plugins_config/gs_config.py | 7 ++++ gsuid_core/utils/plugins_config/log_config.py | 16 ++++++++ gsuid_core/webconsole/log.py | 5 ++- 9 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 gsuid_core/utils/plugins_config/log_config.py diff --git a/gsuid_core/bot.py b/gsuid_core/bot.py index 9845056..228afe2 100644 --- a/gsuid_core/bot.py +++ b/gsuid_core/bot.py @@ -137,7 +137,7 @@ class _Bot: msg_id = sp_msg_id for mr in message_result: - logger.trace(f'[GsCore][即将发送消息] {mr}') + logger.trace('[GsCore][即将发送消息]', messages=mr) if at_sender and sender_id: if at_sender_pos == '消息最后': mr.append(MessageSegment.at(sender_id)) diff --git a/gsuid_core/config.py b/gsuid_core/config.py index f45ced7..bf2f7d2 100644 --- a/gsuid_core/config.py +++ b/gsuid_core/config.py @@ -18,6 +18,7 @@ CONFIG_DEFAULT = { 'log': { 'level': 'INFO', 'output': ['stdout', 'stderr', 'file'], + 'module': False, # ... }, 'enable_empty_start': True, diff --git a/gsuid_core/handler.py b/gsuid_core/handler.py index a858432..a8554ae 100644 --- a/gsuid_core/handler.py +++ b/gsuid_core/handler.py @@ -16,9 +16,11 @@ from gsuid_core.models import Event, Message, MessageReceive from gsuid_core.utils.database.models import CoreUser, CoreGroup, Subscribe from gsuid_core.utils.plugins_config.gs_config import ( sp_config, + log_config, core_plugins_config, ) +show_receive: bool = log_config.get_config('ShowReceive').data command_start = core_config.get_config('command_start') enable_empty = core_config.get_config('enable_empty_start') config_masters = core_config.get_config('masters') @@ -38,7 +40,8 @@ async def handle_event(ws: _Bot, msg: MessageReceive, is_http: bool = False): # 获取用户权限,越小越高 msg.user_pm = user_pm = await get_user_pml(msg) event = await msg_process(msg) - logger.info('[收到事件]', event_payload=event) + if show_receive: + logger.info('[收到事件]', event_payload=event) if event.user_pm == 0: if not await Subscribe.data_exist( diff --git a/gsuid_core/logger.py b/gsuid_core/logger.py index 52a7b78..d971403 100644 --- a/gsuid_core/logger.py +++ b/gsuid_core/logger.py @@ -16,13 +16,13 @@ from colorama import Fore, Style, init from structlog.types import EventDict, Processor, WrappedLogger from structlog.processors import CallsiteParameter, CallsiteParameterAdder -from gsuid_core.models import Event from gsuid_core.config import core_config +from gsuid_core.models import Event, Message from gsuid_core.data_store import get_res_path log_history: List[EventDict] = [] LOG_PATH = get_res_path() / 'logs' -IS_DEBUG_LOG = False +IS_DEBUG_LOG: bool = False class DailyNamedFileHandler(TimedRotatingFileHandler): @@ -30,7 +30,7 @@ class DailyNamedFileHandler(TimedRotatingFileHandler): 一个会自动使用 YYYY-MM-DD.log 作为文件名的日志处理器。 """ - def __init__(self, log_dir, backupCount=7, encoding='utf-8'): + def __init__(self, log_dir, backupCount=0, encoding='utf-8'): self.log_dir = Path(log_dir) self.log_dir.mkdir(parents=True, exist_ok=True) @@ -60,28 +60,11 @@ class DailyNamedFileHandler(TimedRotatingFileHandler): self.baseFilename = self._get_dated_filename() - self._cleanup_logs() + # self._cleanup_logs() if not self.delay: self.stream = self._open() - def _cleanup_logs(self): - """根据 backupCount 清理旧的日志文件。""" - if self.backupCount > 0: - # backupCount + 1 是因为当前日志文件也计算在内 - log_files = sorted( - self.log_dir.glob("*.log"), - key=lambda f: f.stat().st_mtime, - reverse=True, - ) - - for f in log_files[self.backupCount :]: # noqa: E203 - try: - f.unlink() - except OSError: - # 在并发环境下,文件可能已被其他进程删除 - pass - class TraceCapableLogger(Protocol): def trace(self, event: Any, *args: Any, **kwargs: Any) -> None: ... @@ -127,6 +110,13 @@ def format_callsite_processor( return event_dict +def reduce_message(messages: List[Message]): + for message in messages: + if message.data and len(message.data) >= 500: + message.data = message.data[:100] + return messages + + def format_event_for_console( logger: WrappedLogger, method_name: str, event_dict: EventDict ) -> EventDict: @@ -142,10 +132,14 @@ def format_event_for_console( f'group_id={event.group_id}, ' f'user_id={event.user_id}, ' f'user_pm={event.user_pm}, ' - f'content={event.content}, ' + f'content={reduce_message(event.content)}, ' ) event_dict.pop("event_payload") + messages: Optional[List[Message]] = event_dict.get("messages") + if isinstance(messages, List): + event_dict['messages'] = reduce_message(messages) + return event_dict @@ -322,7 +316,7 @@ def setup_logging(): # 关键:使用 TimedRotatingFileHandler 实现每日轮转 file_handler = DailyNamedFileHandler( log_dir=LOG_PATH, - backupCount=7, + backupCount=0, encoding='utf-8', ) file_handler.setLevel(LEVEL) diff --git a/gsuid_core/utils/backup/backup_files.py b/gsuid_core/utils/backup/backup_files.py index 8d59561..0107e80 100644 --- a/gsuid_core/utils/backup/backup_files.py +++ b/gsuid_core/utils/backup/backup_files.py @@ -4,9 +4,9 @@ from pathlib import Path from shutil import copyfile from gsuid_core.logger import LOG_PATH, logger -from gsuid_core.utils.plugins_config.gs_config import core_plugins_config +from gsuid_core.utils.plugins_config.gs_config import log_config -CLEAN_DAY: str = core_plugins_config.get_config('ScheduledCleanLogDay').data +CLEAN_DAY: str = log_config.get_config('ScheduledCleanLogDay').data def clean_log(): diff --git a/gsuid_core/utils/plugins_config/config_default.py b/gsuid_core/utils/plugins_config/config_default.py index 07569d1..39d1cf2 100644 --- a/gsuid_core/utils/plugins_config/config_default.py +++ b/gsuid_core/utils/plugins_config/config_default.py @@ -178,11 +178,6 @@ CONIFG_DEFAULT: Dict[str, GSC] = { ['38890', '28541', '28542'], ['38890', '28541', '28542'], ), - 'ScheduledCleanLogDay': GsStrConfig( - '定时清理几天外的日志', - '定时清理几天外的日志', - '8', - ), 'EnableForwardMessage': GsStrConfig( '是否允许发送合并转发', '可选循环发送、合并消息、合并转发、禁止', diff --git a/gsuid_core/utils/plugins_config/gs_config.py b/gsuid_core/utils/plugins_config/gs_config.py index 90c0446..d4cd26a 100644 --- a/gsuid_core/utils/plugins_config/gs_config.py +++ b/gsuid_core/utils/plugins_config/gs_config.py @@ -10,6 +10,7 @@ from gsuid_core.logger import logger from gsuid_core.data_store import get_res_path from .sp_config import SP_CONIFG +from .log_config import LOG_CONFIG from .status_config import STATUS_CONIFG from .config_default import CONIFG_DEFAULT from .pic_gen_config import PIC_GEN_CONIFG @@ -225,6 +226,12 @@ send_pic_config = StringConfig( SEND_PIC_CONIFG, ) +log_config = StringConfig( + 'GsCore日志配置', + RES / 'log_config.json', + LOG_CONFIG, +) + pic_gen_config = StringConfig( 'GsCore图片生成', RES / 'pic_gen_config.json', diff --git a/gsuid_core/utils/plugins_config/log_config.py b/gsuid_core/utils/plugins_config/log_config.py new file mode 100644 index 0000000..867e64f --- /dev/null +++ b/gsuid_core/utils/plugins_config/log_config.py @@ -0,0 +1,16 @@ +from typing import Dict + +from .models import GSC, GsStrConfig, GsBoolConfig + +LOG_CONFIG: Dict[str, GSC] = { + 'ScheduledCleanLogDay': GsStrConfig( + '定时清理几天外的日志', + '定时清理几天外的日志', + '8', + ), + 'ShowReceive': GsBoolConfig( + '显示用户普通消息', + '关闭该选项将导致log只记录命令触发!', + True, + ), +} diff --git a/gsuid_core/webconsole/log.py b/gsuid_core/webconsole/log.py index 90bd630..13dce30 100644 --- a/gsuid_core/webconsole/log.py +++ b/gsuid_core/webconsole/log.py @@ -77,6 +77,7 @@ HTML = """ .log-level.WARN { background-color: #FFC107; color: #333; } .log-level.WARNING { background-color: #FFC107; color: #333; } .log-level.ERROR { background-color: #F44336; } + .log-level.TRACE { background-color: #673AB7; } .log-level.CRITICAL { background-color: #F44336; } .log-level.EXCEPTION { background-color: #F44336; } @@ -188,15 +189,17 @@ ON_MOUNT_SSE = """ } // ======================= 修改结束 ======================= + logEntry.innerHTML = ` ${time} ${level} ${messageHtml} `; + const isScrolledToBottom = logContainer.scrollHeight - logContainer.clientHeight <= logContainer.scrollTop + 5; + logContainer.appendChild(logEntry); - const isScrolledToBottom = logContainer.scrollHeight - logContainer.clientHeight <= logContainer.scrollTop + 5; if (isScrolledToBottom) { logContainer.scrollTop = logContainer.scrollHeight; }