mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-01-29 00:35:38 +08:00
feat: add get clash logs from service
chore: log message
This commit is contained in:
4
src-tauri/Cargo.lock
generated
4
src-tauri/Cargo.lock
generated
@@ -1173,8 +1173,8 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clash_verge_service_ipc"
|
name = "clash_verge_service_ipc"
|
||||||
version = "2.0.14"
|
version = "2.0.15"
|
||||||
source = "git+https://github.com/clash-verge-rev/clash-verge-service-ipc#0b78603344302de33712d2f7554329bdb0091e1e"
|
source = "git+https://github.com/clash-verge-rev/clash-verge-service-ipc#0c4c1d3d301e90238a6bf430b784a9c5e0f4a477"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"kode-bridge",
|
"kode-bridge",
|
||||||
|
|||||||
@@ -3,13 +3,10 @@ use std::collections::VecDeque;
|
|||||||
use super::CmdResult;
|
use super::CmdResult;
|
||||||
use crate::{
|
use crate::{
|
||||||
config::Config,
|
config::Config,
|
||||||
core::{self, CoreManager, RunningMode, handle, logger},
|
core::{CoreManager, handle},
|
||||||
};
|
};
|
||||||
use crate::{config::*, feat, logging, utils::logging::Type, wrap_err};
|
use crate::{config::*, feat, logging, utils::logging::Type, wrap_err};
|
||||||
use serde_yaml_ng::Mapping;
|
use serde_yaml_ng::Mapping;
|
||||||
// use std::time::Duration;
|
|
||||||
|
|
||||||
// const CONFIG_REFRESH_INTERVAL: Duration = Duration::from_secs(60);
|
|
||||||
|
|
||||||
/// 复制Clash环境变量
|
/// 复制Clash环境变量
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
@@ -289,11 +286,9 @@ pub async fn validate_dns_config() -> CmdResult<(bool, String)> {
|
|||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub async fn get_clash_logs() -> CmdResult<VecDeque<String>> {
|
pub async fn get_clash_logs() -> CmdResult<VecDeque<String>> {
|
||||||
let logs = match core::CoreManager::global().get_running_mode() {
|
let logs = CoreManager::global()
|
||||||
// TODO: 服务模式下日志获取接口
|
.get_clash_logs()
|
||||||
RunningMode::Service => VecDeque::new(),
|
.await
|
||||||
RunningMode::Sidecar => logger::Logger::global().get_logs().clone(),
|
.unwrap_or_default();
|
||||||
_ => VecDeque::new(),
|
|
||||||
};
|
|
||||||
Ok(logs)
|
Ok(logs)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use crate::AsyncHandler;
|
use crate::AsyncHandler;
|
||||||
use crate::core::logger::Logger;
|
use crate::core::logger::ClashLogger;
|
||||||
use crate::process::CommandChildGuard;
|
use crate::process::CommandChildGuard;
|
||||||
use crate::utils::init::sidecar_writer;
|
use crate::utils::init::sidecar_writer;
|
||||||
use crate::utils::logging::SharedWriter;
|
use crate::utils::logging::SharedWriter;
|
||||||
@@ -21,6 +21,7 @@ use flexi_logger::DeferredNow;
|
|||||||
use flexi_logger::writers::LogWriter;
|
use flexi_logger::writers::LogWriter;
|
||||||
use log::Record;
|
use log::Record;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
|
use std::collections::VecDeque;
|
||||||
use std::{fmt, path::PathBuf, sync::Arc};
|
use std::{fmt, path::PathBuf, sync::Arc};
|
||||||
use tauri_plugin_shell::ShellExt;
|
use tauri_plugin_shell::ShellExt;
|
||||||
|
|
||||||
@@ -772,13 +773,13 @@ impl CoreManager {
|
|||||||
let mut now = DeferredNow::default();
|
let mut now = DeferredNow::default();
|
||||||
let message = String::from_utf8_lossy(&line).into_owned();
|
let message = String::from_utf8_lossy(&line).into_owned();
|
||||||
let message = write_sidecar_log(&*w, &mut now, log::Level::Error, message);
|
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) => {
|
tauri_plugin_shell::process::CommandEvent::Stderr(line) => {
|
||||||
let mut now = DeferredNow::default();
|
let mut now = DeferredNow::default();
|
||||||
let message = String::from_utf8_lossy(&line).into_owned();
|
let message = String::from_utf8_lossy(&line).into_owned();
|
||||||
let message = write_sidecar_log(&*w, &mut now, log::Level::Error, message);
|
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) => {
|
tauri_plugin_shell::process::CommandEvent::Terminated(term) => {
|
||||||
let mut now = DeferredNow::default();
|
let mut now = DeferredNow::default();
|
||||||
@@ -820,6 +821,7 @@ impl CoreManager {
|
|||||||
self.set_running_mode(RunningMode::Service);
|
self.set_running_mode(RunningMode::Service);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn stop_core_by_service(&self) -> Result<()> {
|
async fn stop_core_by_service(&self) -> Result<()> {
|
||||||
logging!(info, Type::Core, "Stopping core by service");
|
logging!(info, Type::Core, "Stopping core by service");
|
||||||
service::stop_core_by_service().await?;
|
service::stop_core_by_service().await?;
|
||||||
@@ -897,9 +899,19 @@ impl CoreManager {
|
|||||||
Ok(())
|
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<()> {
|
pub async fn stop_core(&self) -> Result<()> {
|
||||||
Logger::global().clear_logs();
|
ClashLogger::global().clear_logs();
|
||||||
match self.get_running_mode() {
|
match self.get_running_mode() {
|
||||||
RunningMode::Service => self.stop_core_by_service().await,
|
RunningMode::Service => self.stop_core_by_service().await,
|
||||||
RunningMode::Sidecar => self.stop_core_by_sidecar(),
|
RunningMode::Sidecar => self.stop_core_by_sidecar(),
|
||||||
|
|||||||
@@ -5,15 +5,15 @@ use parking_lot::{RwLock, RwLockReadGuard};
|
|||||||
|
|
||||||
const LOGS_QUEUE_LEN: usize = 100;
|
const LOGS_QUEUE_LEN: usize = 100;
|
||||||
|
|
||||||
pub struct Logger {
|
pub struct ClashLogger {
|
||||||
logs: Arc<RwLock<VecDeque<String>>>,
|
logs: Arc<RwLock<VecDeque<String>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Logger {
|
impl ClashLogger {
|
||||||
pub fn global() -> &'static Logger {
|
pub fn global() -> &'static ClashLogger {
|
||||||
static LOGGER: OnceCell<Logger> = OnceCell::new();
|
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))),
|
logs: Arc::new(RwLock::new(VecDeque::with_capacity(LOGS_QUEUE_LEN + 10))),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use anyhow::{Context, Result, bail};
|
|||||||
use clash_verge_service_ipc::CoreConfig;
|
use clash_verge_service_ipc::CoreConfig;
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use std::{
|
use std::{
|
||||||
|
collections::VecDeque,
|
||||||
env::current_exe,
|
env::current_exe,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
process::Command as StdCommand,
|
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
|
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
|
/// 通过服务停止core
|
||||||
pub(super) async fn stop_core_by_service() -> Result<()> {
|
pub(super) async fn stop_core_by_service() -> Result<()> {
|
||||||
logging!(info, Type::Service, "通过服务停止核心 (IPC)");
|
logging!(info, Type::Service, "通过服务停止核心 (IPC)");
|
||||||
|
|||||||
Reference in New Issue
Block a user