From d16c691c0fddfd584fcd95726e96cf183ad93479 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Sun, 3 Aug 2025 09:52:27 +0800 Subject: [PATCH] fix: can not filiter log level as expected --- UPDATELOG.md | 2 +- src-tauri/src/cmd/clash.rs | 7 ++++ src-tauri/src/ipc/logs.rs | 65 ++++++++++++++++-------------- src-tauri/src/ipc/mod.rs | 2 +- src-tauri/src/lib.rs | 1 + src/pages/_layout.tsx | 7 +++- src/pages/logs.tsx | 4 +- src/services/cmds.ts | 4 ++ src/services/global-log-service.ts | 24 +++++++---- src/services/ipc-log-service.ts | 11 +++++ 10 files changed, 83 insertions(+), 44 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index ab75da3ea..8222eda94 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -45,7 +45,7 @@ - 修复 `Windows` 安装器参数使用错误问题 - 修复 `IPC` 迁移后节点测速功能异常 - 修复 `IPC` 迁移后连接上下行速率计算功能异常 -- 修复 `IPC` 迁移后内核日志功能异常 +- 修复 `IPC` 迁移后内核日志(等级切换)功能异常 - 修复 `External-Controller-Cors` 无法保存所需前置条件 - 修复首页端口不一致问题 - 修复首页流量统计卡片重构后无法显示流量刻度线 diff --git a/src-tauri/src/cmd/clash.rs b/src-tauri/src/cmd/clash.rs index a8c1822b2..722eb6b98 100644 --- a/src-tauri/src/cmd/clash.rs +++ b/src-tauri/src/cmd/clash.rs @@ -591,6 +591,13 @@ pub async fn start_logs_monitoring(level: Option) -> CmdResult { Ok(()) } +/// 停止日志监控 +#[tauri::command] +pub async fn stop_logs_monitoring() -> CmdResult { + ipc::stop_logs_monitoring().await; + Ok(()) +} + /// 清除日志 #[tauri::command] pub async fn clear_logs() -> CmdResult { diff --git a/src-tauri/src/ipc/logs.rs b/src-tauri/src/ipc/logs.rs index 37f262832..dd55412b7 100644 --- a/src-tauri/src/ipc/logs.rs +++ b/src-tauri/src/ipc/logs.rs @@ -153,16 +153,7 @@ impl LogsMonitor { } }; - let url = if filter_level == "info" { - "/logs".to_string() - } else { - let level_param = if filter_level == "all" { - "debug" - } else { - &filter_level - }; - format!("/logs?level={level_param}") - }; + let url = "/logs"; logging!( info, @@ -173,7 +164,7 @@ impl LogsMonitor { ); let _ = client - .get(&url) + .get(url) .timeout(Duration::from_secs(30)) .process_lines(|line| { Self::process_log_line(line, &filter_level, monitor_current.clone()) @@ -200,6 +191,28 @@ impl LogsMonitor { ); } + pub async fn stop_monitoring(&self) { + // Stop monitoring task but keep logs + { + let mut handle = self.task_handle.write().await; + if let Some(task) = handle.take() { + task.abort(); + logging!( + info, + Type::Ipc, + true, + "LogsMonitor: Stopped monitoring task" + ); + } + } + + // Reset monitoring level + { + let mut monitoring_level = self.current_monitoring_level.write().await; + *monitoring_level = None; + } + } + async fn create_ipc_client() -> Result< (std::path::PathBuf, kode_bridge::IpcStreamClient), Box, @@ -253,26 +266,12 @@ impl LogsMonitor { let mut current = self.current.write().await; current.logs.clear(); current.mark_fresh(); - - // Also reset monitoring level when clearing logs - { - let mut monitoring_level = self.current_monitoring_level.write().await; - *monitoring_level = None; - } - - // Abort current monitoring task - { - let mut handle = self.task_handle.write().await; - if let Some(task) = handle.take() { - task.abort(); - logging!( - info, - Type::Ipc, - true, - "LogsMonitor: Stopped monitoring task due to clear_logs" - ); - } - } + logging!( + info, + Type::Ipc, + true, + "LogsMonitor: Cleared frontend logs (monitoring continues)" + ); } pub async fn get_logs_as_json(&self, level: Option) -> serde_json::Value { @@ -309,6 +308,10 @@ pub async fn start_logs_monitoring(level: Option) { LogsMonitor::global().start_monitoring(level).await; } +pub async fn stop_logs_monitoring() { + LogsMonitor::global().stop_monitoring().await; +} + pub async fn clear_logs() { LogsMonitor::global().clear_logs().await; } diff --git a/src-tauri/src/ipc/mod.rs b/src-tauri/src/ipc/mod.rs index 8332cee31..8b2f42f87 100644 --- a/src-tauri/src/ipc/mod.rs +++ b/src-tauri/src/ipc/mod.rs @@ -5,7 +5,7 @@ pub mod monitor; pub mod traffic; pub use general::IpcManager; -pub use logs::{clear_logs, get_logs_json, start_logs_monitoring}; +pub use logs::{clear_logs, get_logs_json, start_logs_monitoring, stop_logs_monitoring}; pub use memory::{get_current_memory, get_formatted_memory}; pub use traffic::{get_current_traffic, get_formatted_traffic}; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 513c825f2..333b50b47 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -355,6 +355,7 @@ mod app_init { // Logging and monitoring cmd::get_clash_logs, cmd::start_logs_monitoring, + cmd::stop_logs_monitoring, cmd::clear_logs, cmd::get_traffic_data, cmd::get_memory_data, diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index ab1645a11..cfe17d8ff 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -30,6 +30,8 @@ import { initGlobalLogService } from "@/services/global-log-service"; import { invoke } from "@tauri-apps/api/core"; import { showNotice } from "@/services/noticeService"; import { NoticeManager } from "@/components/base/NoticeManager"; +import { useLocalStorage } from "foxact/use-local-storage"; +import { LogLevel } from "@/hooks/use-log-data"; const appWindow = getCurrentWebviewWindow(); export let portableFlag = false; @@ -154,6 +156,7 @@ const Layout = () => { const { verge } = useVerge(); const { clashInfo } = useClashInfo(); const [enableLog] = useEnableLog(); + const [logLevel] = useLocalStorage("log:log-level", "info"); const { language, start_page } = verge ?? {}; const navigate = useNavigate(); const location = useLocation(); @@ -184,9 +187,9 @@ const Layout = () => { useEffect(() => { if (clashInfo) { const { server = "", secret = "" } = clashInfo; - initGlobalLogService(enableLog, "info"); + initGlobalLogService(enableLog, logLevel); } - }, [clashInfo, enableLog]); + }, [clashInfo, enableLog, logLevel]); // 设置监听器 useEffect(() => { diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx index a937fa29a..d5dd862f9 100644 --- a/src/pages/logs.tsx +++ b/src/pages/logs.tsx @@ -74,8 +74,8 @@ const LogPage = () => { changeLogLevel(newLevel); }; - const handleToggleLog = () => { - toggleLogEnabled(); + const handleToggleLog = async () => { + await toggleLogEnabled(); setEnableLog(!enableLog); }; diff --git a/src/services/cmds.ts b/src/services/cmds.ts index b71429fd8..220a807f9 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -420,6 +420,10 @@ export async function startLogsMonitoring(level?: string) { return invoke("start_logs_monitoring", { level }); } +export async function stopLogsMonitoring() { + return invoke("stop_logs_monitoring"); +} + export async function clearLogs() { return invoke("clear_logs"); } diff --git a/src/services/global-log-service.ts b/src/services/global-log-service.ts index d2fd1e5f8..f60a159f2 100644 --- a/src/services/global-log-service.ts +++ b/src/services/global-log-service.ts @@ -3,6 +3,7 @@ import { create } from "zustand"; import { fetchLogsViaIPC, startLogsStreaming, + stopLogsStreaming, clearLogs as clearLogsIPC, } from "@/services/ipc-log-service"; import dayjs from "dayjs"; @@ -123,12 +124,21 @@ const clearIpcPolling = () => { } }; -// 关闭全局日志连接 (仅IPC模式) -export const closeGlobalLogConnection = () => { +// 停止日志监控 (仅IPC模式) +export const stopGlobalLogMonitoring = async () => { clearIpcPolling(); isInitializing = false; // 重置初始化标志 + + // 调用后端停止监控 + await stopLogsStreaming(); + useGlobalLogStore.setState({ isConnected: false }); - console.log("[GlobalLog-IPC] 日志服务已关闭"); + console.log("[GlobalLog-IPC] 日志监控已停止"); +}; + +// 关闭全局日志连接 (仅IPC模式) - 保持向后兼容 +export const closeGlobalLogConnection = async () => { + await stopGlobalLogMonitoring(); }; // 切换日志级别 (仅IPC模式) @@ -150,7 +160,7 @@ export const changeLogLevel = (level: LogLevel) => { }; // 切换启用状态 (仅IPC模式) -export const toggleLogEnabled = () => { +export const toggleLogEnabled = async () => { const { enabled, currentLevel } = useGlobalLogStore.getState(); const newEnabled = !enabled; @@ -160,14 +170,14 @@ export const toggleLogEnabled = () => { // IPC模式下直接启动 initGlobalLogService(newEnabled, currentLevel); } else { - closeGlobalLogConnection(); + await stopGlobalLogMonitoring(); } }; -// 获取日志清理函数 +// 获取日志清理函数 - 只清理前端日志,不停止监控 export const clearGlobalLogs = () => { useGlobalLogStore.getState().clearLogs(); - // 同时清理后端流式缓存 + // 同时清理后端缓存的日志,但不停止监控 clearLogsIPC(); }; diff --git a/src/services/ipc-log-service.ts b/src/services/ipc-log-service.ts index 3ba3a4826..954f1b60a 100644 --- a/src/services/ipc-log-service.ts +++ b/src/services/ipc-log-service.ts @@ -2,6 +2,7 @@ import { getClashLogs, startLogsMonitoring, + stopLogsMonitoring, clearLogs as clearLogsCmd, } from "@/services/cmds"; import dayjs from "dayjs"; @@ -28,6 +29,16 @@ export const startLogsStreaming = async (logLevel: LogLevel = "info") => { } }; +// Stop logs monitoring +export const stopLogsStreaming = async () => { + try { + await stopLogsMonitoring(); + console.log("[IPC-LogService] Stopped logs monitoring"); + } catch (error) { + console.error("[IPC-LogService] Failed to stop logs monitoring:", error); + } +}; + // Fetch logs using IPC command (now from streaming cache) export const fetchLogsViaIPC = async ( logLevel: LogLevel = "info",