diff --git a/handlers/admin.py b/handlers/admin.py index 8186753..bb79b7a 100644 --- a/handlers/admin.py +++ b/handlers/admin.py @@ -58,7 +58,7 @@ async def cmd_ban(update: Update, context: ContextTypes.DEFAULT_TYPE): await Action.create(action="BAN", user_id=user_id, username=target, operator_id=update.effective_user.id) reply = await update.message.reply_text(f"🔨 已封禁 {target} ({user_id}) {config.BAN_DURATION_MINUTES} 分钟") except Exception as e: - logger.exception("手动封禁失败") + logger.error(f"手动封禁失败: {type(e).__name__}: {e}") reply = await update.message.reply_text(f"❌ 封禁失败: {e}") asyncio.create_task(auto_delete(reply)) @@ -81,7 +81,7 @@ async def cmd_unban(update: Update, context: ContextTypes.DEFAULT_TYPE): await Action.create(action="UNBAN", user_id=user_id, username=target, operator_id=update.effective_user.id) reply = await update.message.reply_text(f"🔓 已解封用户 {target} ({user_id})") except Exception as e: - logger.exception("手动解封失败") + logger.error(f"手动解封失败: {type(e).__name__}: {e}") reply = await update.message.reply_text(f"❌ 解封失败: {e}") asyncio.create_task(auto_delete(reply)) @@ -140,7 +140,7 @@ async def cmd_mute(update: Update, context: ContextTypes.DEFAULT_TYPE): await Action.create(action="MUTE", user_id=user_id, username=target, operator_id=update.effective_user.id, details={"minutes": minutes}) reply = await update.message.reply_text(f"🔇 已禁言 {target} ({user_id}) {minutes} 分钟") except Exception as e: - logger.exception("禁言失败") + logger.error(f"禁言失败: {type(e).__name__}: {e}") reply = await update.message.reply_text(f"❌ 禁言失败: {e}") asyncio.create_task(auto_delete(reply)) diff --git a/handlers/knowledge.py b/handlers/knowledge.py index 9d4e056..ed0f5f4 100644 --- a/handlers/knowledge.py +++ b/handlers/knowledge.py @@ -121,7 +121,7 @@ async def cmd_ask(update: Update, context: ContextTypes.DEFAULT_TYPE): asyncio.create_task(auto_delete(reply, seconds=60)) return - logger.info(f"📩 用户提问: [{update.message.from_user.username}] {query}") + logger.debug(f"📩 用户提问: [{update.message.from_user.username}] {query[:80]}") searching_msg = await safe_send(update, context, "🔍 正在搜索知识库并整理详细答案...") asyncio.create_task(auto_delete(update.message, seconds=60)) diff --git a/handlers/spam.py b/handlers/spam.py index 3d28ed5..4e1958b 100644 --- a/handlers/spam.py +++ b/handlers/spam.py @@ -30,7 +30,7 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE): username = user.username or "" first_name = user.first_name or "" text = msg.text - logger.info(f"💬 聊天消息 [{username or first_name or user.id}]: {text[:120]}") + logger.debug(f"💬 聊天消息 [{username or first_name or user.id}]: {text[:80]}") # === 防刷屏 === now = datetime.now().timestamp() diff --git a/web/api.py b/web/api.py index d2a2f1c..edf49b9 100644 --- a/web/api.py +++ b/web/api.py @@ -24,7 +24,17 @@ app.mount("/static", StaticFiles(directory=str(BASE_DIR / "static")), name="stat # SSE _sse_queues: list[asyncio.Queue] = [] _log_buffer: list[dict] = [] -MAX_LOG_BUFFER = 300 +MAX_LOG_BUFFER = 120 +MAX_LOG_MESSAGE_CHARS = 320 + + +def compact_log_message(record: logging.LogRecord) -> str: + """Web 日志只展示单行摘要,避免大段 traceback/长文本刷屏。""" + msg = record.getMessage().replace("\r", " ").replace("\n", " ") + msg = " ".join(msg.split()) + if len(msg) > MAX_LOG_MESSAGE_CHARS: + msg = msg[:MAX_LOG_MESSAGE_CHARS] + "..." + return f"{format_dt(from_timestamp(record.created))} [{record.levelname}] {msg}" class SSELogHandler(logging.Handler): @@ -35,7 +45,7 @@ class SSELogHandler(logging.Handler): item = { "time": format_dt(from_timestamp(record.created)), "level": record.levelname, - "message": self.format(record), + "message": compact_log_message(record), } _log_buffer.append(item) del _log_buffer[:-MAX_LOG_BUFFER] @@ -53,8 +63,8 @@ def install_log_handler(): if any(isinstance(h, SSELogHandler) for h in logger.handlers): return handler = SSELogHandler() - handler.setLevel(logging.INFO) - handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(message)s", "%Y-%m-%d %H:%M:%S")) + handler.setLevel(logging.WARNING) + handler.setFormatter(logging.Formatter("%(message)s")) logger.addHandler(handler)