From c27ad3fdcbeae23562f45537aebb23aab54f6ff3 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Thu, 30 Oct 2025 17:32:54 +0800 Subject: [PATCH] feat: add log opening functionality in tray menu and update localization --- UPDATELOG.md | 1 + src-tauri/src/cmd/app.rs | 14 ++++++++++++++ src-tauri/src/core/tray/menu_def.rs | 2 ++ src-tauri/src/core/tray/mod.rs | 30 ++++++++++++++++++++++++++++- src-tauri/src/lib.rs | 2 ++ src-tauri/src/utils/dirs.rs | 20 ++++++++++++++++++- src/locales/en.json | 4 +++- src/locales/zh.json | 4 +++- 8 files changed, 73 insertions(+), 4 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index 51236c73..b37eca6e 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -48,6 +48,7 @@ - 允许独立控制订阅自动更新 - 托盘 `更多` 中新增 `关闭所有连接` 按钮 - 新增左侧菜单栏的排序功能(右键点击左侧菜单栏) +- 托盘 `打开目录` 中新增 `应用日志` 和 `内核日志`
diff --git a/src-tauri/src/cmd/app.rs b/src-tauri/src/cmd/app.rs index 4daa150f..11a9207f 100644 --- a/src-tauri/src/cmd/app.rs +++ b/src-tauri/src/cmd/app.rs @@ -41,6 +41,20 @@ pub fn open_web_url(url: String) -> CmdResult<()> { open::that(url.as_str()).stringify_err() } +// TODO 后续可以为前端提供接口,当前作为托盘菜单使用 +/// 打开 Verge 最新日志 +#[tauri::command] +pub async fn open_app_log() -> CmdResult<()> { + open::that(dirs::app_latest_log().stringify_err()?).stringify_err() +} + +// TODO 后续可以为前端提供接口,当前作为托盘菜单使用 +/// 打开 Clash 最新日志 +#[tauri::command] +pub async fn open_core_log() -> CmdResult<()> { + open::that(dirs::clash_latest_log().stringify_err()?).stringify_err() +} + /// 打开/关闭开发者工具 #[tauri::command] pub fn open_devtools(app_handle: AppHandle) { diff --git a/src-tauri/src/core/tray/menu_def.rs b/src-tauri/src/core/tray/menu_def.rs index c2acbe25..10fe3835 100644 --- a/src-tauri/src/core/tray/menu_def.rs +++ b/src-tauri/src/core/tray/menu_def.rs @@ -39,6 +39,8 @@ define_menu! { core_dir => CORE_DIR, "tray_core_dir", "Core Dir", logs_dir => LOGS_DIR, "tray_logs_dir", "Logs Dir", open_dir => OPEN_DIR, "tray_open_dir", "Open Dir", + app_log => APP_LOG, "tray_app_log", "Open App Log", + core_log => CORE_LOG, "tray_core_log", "Open Core Log", restart_clash => RESTART_CLASH, "tray_restart_clash", "Restart Clash Core", restart_app => RESTART_APP, "tray_restart_app", "Restart App", verge_version => VERGE_VERSION, "tray_verge_version", "Verge Version", diff --git a/src-tauri/src/core/tray/mod.rs b/src-tauri/src/core/tray/mod.rs index 6b4eef42..a2b15ff6 100644 --- a/src-tauri/src/core/tray/mod.rs +++ b/src-tauri/src/core/tray/mod.rs @@ -1034,12 +1034,34 @@ async fn create_tray_menu( None::<&str>, )?; + let open_app_log = &MenuItem::with_id( + app_handle, + MenuIds::APP_LOG, + &texts.app_log, + true, + None::<&str>, + )?; + + let open_core_log = &MenuItem::with_id( + app_handle, + MenuIds::CORE_LOG, + &texts.core_log, + true, + None::<&str>, + )?; + let open_dir = &Submenu::with_id_and_items( app_handle, MenuIds::OPEN_DIR, &texts.open_dir, true, - &[open_app_dir, open_core_dir, open_logs_dir], + &[ + open_app_dir, + open_core_dir, + open_logs_dir, + open_app_log, + open_core_log, + ], )?; let restart_clash = &MenuItem::with_id( @@ -1169,6 +1191,12 @@ fn on_menu_event(_: &AppHandle, event: MenuEvent) { MenuIds::LOGS_DIR => { let _ = cmd::open_logs_dir().await; } + MenuIds::APP_LOG => { + let _ = cmd::open_app_log().await; + } + MenuIds::CORE_LOG => { + let _ = cmd::open_core_log().await; + } MenuIds::RESTART_CLASH => feat::restart_clash_core().await, MenuIds::RESTART_APP => feat::restart_app().await, MenuIds::LIGHTWEIGHT_MODE => { diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 6f3130fe..84838962 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -141,6 +141,8 @@ mod app_init { cmd::open_logs_dir, cmd::open_web_url, cmd::open_core_dir, + cmd::open_app_log, + cmd::open_core_log, cmd::get_portable_flag, cmd::get_network_interfaces, cmd::get_system_hostname, diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 3730be82..cfae29fe 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -1,4 +1,8 @@ -use crate::{core::handle, logging, utils::logging::Type}; +use crate::{ + core::{CoreManager, handle, manager::RunningMode}, + logging, + utils::logging::Type, +}; use anyhow::Result; use async_trait::async_trait; use once_cell::sync::OnceCell; @@ -122,6 +126,11 @@ pub fn app_logs_dir() -> Result { Ok(app_home_dir()?.join("logs")) } +// latest verge log +pub fn app_latest_log() -> Result { + Ok(app_logs_dir()?.join("latest.log")) +} + /// local backups dir pub fn local_backup_dir() -> Result { let dir = app_home_dir()?.join(BACKUP_DIR); @@ -167,6 +176,15 @@ pub fn service_log_dir() -> Result { Ok(log_dir) } +pub fn clash_latest_log() -> Result { + match *CoreManager::global().get_running_mode() { + RunningMode::Service => Ok(service_log_dir()?.join("service_latest.log")), + RunningMode::Sidecar | RunningMode::NotRunning => { + Ok(sidecar_log_dir()?.join("sidecar_latest.log")) + } + } +} + pub fn path_to_str(path: &PathBuf) -> Result<&str> { let path_str = path .as_os_str() diff --git a/src/locales/en.json b/src/locales/en.json index 28befbd2..e1519a2d 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -713,5 +713,7 @@ "Allow Auto Update": "Allow Auto Update", "Menu reorder mode": "Menu reorder mode", "Unlock menu order": "Unlock menu order", - "Lock menu order": "Lock menu order" + "Lock menu order": "Lock menu order", + "Open App Log": "Open App Log", + "Open Core Log": "Open Core Log" } diff --git a/src/locales/zh.json b/src/locales/zh.json index 1ecd9919..e17e33f9 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -713,5 +713,7 @@ "Allow Auto Update": "允许自动更新", "Menu reorder mode": "菜单排序模式", "Unlock menu order": "解锁菜单排序", - "Lock menu order": "锁定菜单排序" + "Lock menu order": "锁定菜单排序", + "Open App Log": "应用日志", + "Open Core Log": "内核日志" }