refactor(logger): replace ClashLogger with CLASH_LOGGER and update log handling; improve log retrieval and management

This commit is contained in:
Tunglies
2025-10-29 17:58:02 +08:00
parent 2e9f6dd174
commit f4de4738f1
8 changed files with 120 additions and 96 deletions

View File

@@ -1,5 +1,3 @@
use std::collections::VecDeque;
use super::CmdResult;
use crate::{
cmd::StringifyErr,
@@ -275,7 +273,7 @@ pub async fn validate_dns_config() -> CmdResult<(bool, String)> {
}
#[tauri::command]
pub async fn get_clash_logs() -> CmdResult<VecDeque<CompactString>> {
pub async fn get_clash_logs() -> CmdResult<Vec<CompactString>> {
let logs = CoreManager::global()
.get_clash_logs()
.await

View File

@@ -1,38 +1,6 @@
use std::{collections::VecDeque, sync::Arc};
use std::sync::Arc;
use compact_str::CompactString;
use once_cell::sync::OnceCell;
use parking_lot::{RwLock, RwLockReadGuard};
use clash_verge_logger::AsyncLogger;
use once_cell::sync::Lazy;
const LOGS_QUEUE_LEN: usize = 100;
pub struct ClashLogger {
logs: Arc<RwLock<VecDeque<CompactString>>>,
}
impl ClashLogger {
pub fn global() -> &'static ClashLogger {
static LOGGER: OnceCell<ClashLogger> = OnceCell::new();
LOGGER.get_or_init(|| ClashLogger {
logs: Arc::new(RwLock::new(VecDeque::with_capacity(LOGS_QUEUE_LEN + 10))),
})
}
pub fn get_logs(&self) -> RwLockReadGuard<'_, VecDeque<CompactString>> {
self.logs.read()
}
pub fn append_log(&self, text: CompactString) {
let mut logs = self.logs.write();
if logs.len() > LOGS_QUEUE_LEN {
logs.pop_front();
}
logs.push_back(text);
}
pub fn clear_logs(&self) {
let mut logs = self.logs.write();
logs.clear();
}
}
pub static CLASH_LOGGER: Lazy<Arc<AsyncLogger>> = Lazy::new(|| Arc::new(AsyncLogger::new()));

View File

@@ -1,7 +1,7 @@
use super::{CoreManager, RunningMode};
use crate::{
core::{
logger::ClashLogger,
logger::CLASH_LOGGER,
service::{SERVICE_MANAGER, ServiceStatus},
},
logging,
@@ -21,7 +21,7 @@ impl CoreManager {
}
pub async fn stop_core(&self) -> Result<()> {
ClashLogger::global().clear_logs();
CLASH_LOGGER.clear_logs().await;
match *self.get_running_mode() {
RunningMode::Service => self.stop_core_by_service().await,

View File

@@ -2,7 +2,7 @@ use super::{CoreManager, RunningMode};
use crate::{
AsyncHandler,
config::Config,
core::{handle, logger::ClashLogger, service},
core::{handle, logger::CLASH_LOGGER, service},
logging,
process::CommandChildGuard,
utils::{
@@ -16,15 +16,14 @@ use compact_str::CompactString;
use flexi_logger::DeferredNow;
use log::Level;
use scopeguard::defer;
use std::collections::VecDeque;
use tauri_plugin_shell::ShellExt;
impl CoreManager {
pub async fn get_clash_logs(&self) -> Result<VecDeque<CompactString>> {
pub async fn get_clash_logs(&self) -> Result<Vec<CompactString>> {
match *self.get_running_mode() {
RunningMode::Service => service::get_clash_logs_by_service().await,
RunningMode::Sidecar => Ok(ClashLogger::global().get_logs().clone()),
RunningMode::NotRunning => Ok(VecDeque::new()),
RunningMode::Sidecar => Ok(CLASH_LOGGER.get_logs().await),
RunningMode::NotRunning => Ok(Vec::new()),
}
}
@@ -65,7 +64,7 @@ impl CoreManager {
let message = CompactString::from(String::from_utf8_lossy(&line).as_ref());
let w = shared_writer.lock().await;
write_sidecar_log(w, &mut now, Level::Error, &message);
ClashLogger::global().append_log(message);
CLASH_LOGGER.append_log(message).await;
}
tauri_plugin_shell::process::CommandEvent::Terminated(term) => {
let mut now = DeferredNow::default();
@@ -78,7 +77,7 @@ impl CoreManager {
};
let w = shared_writer.lock().await;
write_sidecar_log(w, &mut now, Level::Info, &message);
ClashLogger::global().clear_logs();
CLASH_LOGGER.clear_logs().await;
break;
}
_ => {}

View File

@@ -8,7 +8,6 @@ use clash_verge_service_ipc::CoreConfig;
use compact_str::CompactString;
use once_cell::sync::Lazy;
use std::{
collections::VecDeque,
env::current_exe,
path::{Path, PathBuf},
process::Command as StdCommand,
@@ -394,7 +393,7 @@ 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<CompactString>> {
pub(super) async fn get_clash_logs_by_service() -> Result<Vec<CompactString>> {
logging!(info, Type::Service, "正在获取服务模式下的 Clash 日志");
let response = clash_verge_service_ipc::get_clash_logs()