From 0e9595f2554a4a5a7e6983ab443ec1e22d2619dc Mon Sep 17 00:00:00 2001 From: oomeow Date: Sun, 12 Oct 2025 23:54:48 +0800 Subject: [PATCH] feat: add get clash logs from service chore: log message --- src-tauri/Cargo.lock | 4 ++-- src-tauri/src/cmd/clash.rs | 15 +++++---------- src-tauri/src/core/core.rs | 20 ++++++++++++++++---- src-tauri/src/core/logger.rs | 10 +++++----- src-tauri/src/core/service.rs | 23 +++++++++++++++++++++++ 5 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index ff2ba03f4..0e08bae6e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1173,8 +1173,8 @@ dependencies = [ [[package]] name = "clash_verge_service_ipc" -version = "2.0.14" -source = "git+https://github.com/clash-verge-rev/clash-verge-service-ipc#0b78603344302de33712d2f7554329bdb0091e1e" +version = "2.0.15" +source = "git+https://github.com/clash-verge-rev/clash-verge-service-ipc#0c4c1d3d301e90238a6bf430b784a9c5e0f4a477" dependencies = [ "anyhow", "kode-bridge", diff --git a/src-tauri/src/cmd/clash.rs b/src-tauri/src/cmd/clash.rs index 9fdb4c447..511c7d013 100644 --- a/src-tauri/src/cmd/clash.rs +++ b/src-tauri/src/cmd/clash.rs @@ -3,13 +3,10 @@ use std::collections::VecDeque; use super::CmdResult; use crate::{ config::Config, - core::{self, CoreManager, RunningMode, handle, logger}, + core::{CoreManager, handle}, }; use crate::{config::*, feat, logging, utils::logging::Type, wrap_err}; use serde_yaml_ng::Mapping; -// use std::time::Duration; - -// const CONFIG_REFRESH_INTERVAL: Duration = Duration::from_secs(60); /// 复制Clash环境变量 #[tauri::command] @@ -289,11 +286,9 @@ pub async fn validate_dns_config() -> CmdResult<(bool, String)> { #[tauri::command] pub async fn get_clash_logs() -> CmdResult> { - let logs = match core::CoreManager::global().get_running_mode() { - // TODO: 服务模式下日志获取接口 - RunningMode::Service => VecDeque::new(), - RunningMode::Sidecar => logger::Logger::global().get_logs().clone(), - _ => VecDeque::new(), - }; + let logs = CoreManager::global() + .get_clash_logs() + .await + .unwrap_or_default(); Ok(logs) } diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index fe81e1ee1..8af585b72 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -1,5 +1,5 @@ use crate::AsyncHandler; -use crate::core::logger::Logger; +use crate::core::logger::ClashLogger; use crate::process::CommandChildGuard; use crate::utils::init::sidecar_writer; use crate::utils::logging::SharedWriter; @@ -21,6 +21,7 @@ use flexi_logger::DeferredNow; use flexi_logger::writers::LogWriter; use log::Record; use parking_lot::Mutex; +use std::collections::VecDeque; use std::{fmt, path::PathBuf, sync::Arc}; use tauri_plugin_shell::ShellExt; @@ -772,13 +773,13 @@ impl CoreManager { let mut now = DeferredNow::default(); let message = String::from_utf8_lossy(&line).into_owned(); let message = write_sidecar_log(&*w, &mut now, log::Level::Error, message); - Logger::global().append_log(message); + ClashLogger::global().append_log(message); } tauri_plugin_shell::process::CommandEvent::Stderr(line) => { let mut now = DeferredNow::default(); let message = String::from_utf8_lossy(&line).into_owned(); let message = write_sidecar_log(&*w, &mut now, log::Level::Error, message); - Logger::global().append_log(message); + ClashLogger::global().append_log(message); } tauri_plugin_shell::process::CommandEvent::Terminated(term) => { let mut now = DeferredNow::default(); @@ -820,6 +821,7 @@ impl CoreManager { self.set_running_mode(RunningMode::Service); Ok(()) } + async fn stop_core_by_service(&self) -> Result<()> { logging!(info, Type::Core, "Stopping core by service"); service::stop_core_by_service().await?; @@ -897,9 +899,19 @@ impl CoreManager { Ok(()) } + pub async fn get_clash_logs(&self) -> Result> { + logging!(info, Type::Core, "get clash logs"); + let logs = match self.get_running_mode() { + RunningMode::Service => service::get_clash_logs_by_service().await?, + RunningMode::Sidecar => ClashLogger::global().get_logs().clone(), + _ => VecDeque::new(), + }; + Ok(logs) + } + /// 停止核心运行 pub async fn stop_core(&self) -> Result<()> { - Logger::global().clear_logs(); + ClashLogger::global().clear_logs(); match self.get_running_mode() { RunningMode::Service => self.stop_core_by_service().await, RunningMode::Sidecar => self.stop_core_by_sidecar(), diff --git a/src-tauri/src/core/logger.rs b/src-tauri/src/core/logger.rs index 7eb30479c..cc3c1afbb 100644 --- a/src-tauri/src/core/logger.rs +++ b/src-tauri/src/core/logger.rs @@ -5,15 +5,15 @@ use parking_lot::{RwLock, RwLockReadGuard}; const LOGS_QUEUE_LEN: usize = 100; -pub struct Logger { +pub struct ClashLogger { logs: Arc>>, } -impl Logger { - pub fn global() -> &'static Logger { - static LOGGER: OnceCell = OnceCell::new(); +impl ClashLogger { + pub fn global() -> &'static ClashLogger { + static LOGGER: OnceCell = OnceCell::new(); - LOGGER.get_or_init(|| Logger { + LOGGER.get_or_init(|| ClashLogger { logs: Arc::new(RwLock::new(VecDeque::with_capacity(LOGS_QUEUE_LEN + 10))), }) } diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 0a752cedc..cd7ae61da 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -7,6 +7,7 @@ use anyhow::{Context, Result, bail}; use clash_verge_service_ipc::CoreConfig; use once_cell::sync::Lazy; use std::{ + collections::VecDeque, env::current_exe, path::{Path, PathBuf}, process::Command as StdCommand, @@ -392,6 +393,28 @@ pub(super) async fn run_core_by_service(config_file: &PathBuf) -> Result<()> { start_with_existing_service(config_file).await } +pub(super) async fn get_clash_logs_by_service() -> Result> { + logging!(info, Type::Service, "正在获取服务模式下的 Clash 日志"); + + let response = clash_verge_service_ipc::get_clash_logs() + .await + .context("无法连接到Clash Verge Service")?; + + if response.code > 0 { + let err_msg = response.message; + logging!( + error, + Type::Service, + "获取服务模式下的 Clash 日志失败: {}", + err_msg + ); + bail!(err_msg); + } + + logging!(info, Type::Service, "成功获取服务模式下的 Clash 日志"); + Ok(response.data.unwrap_or_default()) +} + /// 通过服务停止core pub(super) async fn stop_core_by_service() -> Result<()> { logging!(info, Type::Service, "通过服务停止核心 (IPC)");