feat: add get clash logs from service

chore: log message
This commit is contained in:
oomeow
2025-10-12 23:54:48 +08:00
parent 19246ac616
commit 0e9595f255
5 changed files with 51 additions and 21 deletions

4
src-tauri/Cargo.lock generated
View File

@@ -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",

View File

@@ -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<VecDeque<String>> {
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)
}

View File

@@ -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<VecDeque<String>> {
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(),

View File

@@ -5,15 +5,15 @@ use parking_lot::{RwLock, RwLockReadGuard};
const LOGS_QUEUE_LEN: usize = 100;
pub struct Logger {
pub struct ClashLogger {
logs: Arc<RwLock<VecDeque<String>>>,
}
impl Logger {
pub fn global() -> &'static Logger {
static LOGGER: OnceCell<Logger> = OnceCell::new();
impl ClashLogger {
pub fn global() -> &'static ClashLogger {
static LOGGER: OnceCell<ClashLogger> = OnceCell::new();
LOGGER.get_or_init(|| Logger {
LOGGER.get_or_init(|| ClashLogger {
logs: Arc::new(RwLock::new(VecDeque::with_capacity(LOGS_QUEUE_LEN + 10))),
})
}

View File

@@ -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<VecDeque<String>> {
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)");