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;
}