mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-04-18 16:30:32 +08:00
feat!: deprecated recoding core logs from backend
This commit is contained in:
parent
60d3a1927b
commit
41fb6b640e
133
Cargo.lock
generated
133
Cargo.lock
generated
@ -170,12 +170,6 @@ dependencies = [
|
|||||||
"rustversion",
|
"rustversion",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "arraydeque"
|
|
||||||
version = "0.5.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arrayvec"
|
name = "arrayvec"
|
||||||
version = "0.7.6"
|
version = "0.7.6"
|
||||||
@ -1082,15 +1076,6 @@ version = "0.3.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "castaway"
|
|
||||||
version = "0.2.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
|
|
||||||
dependencies = [
|
|
||||||
"rustversion",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.51"
|
version = "1.2.51"
|
||||||
@ -1236,9 +1221,7 @@ dependencies = [
|
|||||||
"clash-verge-logging",
|
"clash-verge-logging",
|
||||||
"clash-verge-signal",
|
"clash-verge-signal",
|
||||||
"clash-verge-types",
|
"clash-verge-types",
|
||||||
"clash_verge_logger",
|
|
||||||
"clash_verge_service_ipc",
|
"clash_verge_service_ipc",
|
||||||
"compact_str",
|
|
||||||
"console-subscriber",
|
"console-subscriber",
|
||||||
"criterion",
|
"criterion",
|
||||||
"dark-light",
|
"dark-light",
|
||||||
@ -1315,9 +1298,9 @@ dependencies = [
|
|||||||
name = "clash-verge-logging"
|
name = "clash-verge-logging"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"compact_str",
|
|
||||||
"flexi_logger",
|
"flexi_logger",
|
||||||
"log",
|
"log",
|
||||||
|
"nu-ansi-term",
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1339,26 +1322,12 @@ dependencies = [
|
|||||||
"smartstring",
|
"smartstring",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clash_verge_logger"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "git+https://github.com/clash-verge-rev/clash-verge-logger#e4768e3852c4868ed86e7210df82c1178467820d"
|
|
||||||
dependencies = [
|
|
||||||
"arraydeque",
|
|
||||||
"compact_str",
|
|
||||||
"flexi_logger",
|
|
||||||
"log",
|
|
||||||
"nu-ansi-term",
|
|
||||||
"tokio",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clash_verge_service_ipc"
|
name = "clash_verge_service_ipc"
|
||||||
version = "2.0.28"
|
version = "2.0.29"
|
||||||
source = "git+https://github.com/clash-verge-rev/clash-verge-service-ipc#384169c7371f78cd213713f0b0a115d48a1f28c3"
|
source = "git+https://github.com/clash-verge-rev/clash-verge-service-ipc?branch=refactor%2Fremove-logs-record#79245a11c90e372399e911533388e8af400a6ede"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"compact_str",
|
|
||||||
"kode-bridge",
|
"kode-bridge",
|
||||||
"log",
|
"log",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
@ -1436,23 +1405,6 @@ dependencies = [
|
|||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "compact_str"
|
|
||||||
version = "0.9.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a"
|
|
||||||
dependencies = [
|
|
||||||
"castaway",
|
|
||||||
"cfg-if",
|
|
||||||
"itoa",
|
|
||||||
"rkyv",
|
|
||||||
"rustversion",
|
|
||||||
"ryu",
|
|
||||||
"serde",
|
|
||||||
"smallvec",
|
|
||||||
"static_assertions",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "concat-idents"
|
name = "concat-idents"
|
||||||
version = "1.1.5"
|
version = "1.1.5"
|
||||||
@ -4568,26 +4520,6 @@ dependencies = [
|
|||||||
"windows-sys 0.60.2",
|
"windows-sys 0.60.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "munge"
|
|
||||||
version = "0.4.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c"
|
|
||||||
dependencies = [
|
|
||||||
"munge_macro",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "munge_macro"
|
|
||||||
version = "0.4.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 2.0.113",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nanoid"
|
name = "nanoid"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
@ -5987,26 +5919,6 @@ version = "2.0.11"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac"
|
checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ptr_meta"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79"
|
|
||||||
dependencies = [
|
|
||||||
"ptr_meta_derive",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ptr_meta_derive"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 2.0.113",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "publicsuffix"
|
name = "publicsuffix"
|
||||||
version = "2.3.0"
|
version = "2.3.0"
|
||||||
@ -6136,15 +6048,6 @@ version = "5.3.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rancor"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee"
|
|
||||||
dependencies = [
|
|
||||||
"ptr_meta",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.7.3"
|
version = "0.7.3"
|
||||||
@ -6395,12 +6298,6 @@ dependencies = [
|
|||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rend"
|
|
||||||
version = "0.5.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "reqwest"
|
name = "reqwest"
|
||||||
version = "0.12.28"
|
version = "0.12.28"
|
||||||
@ -6563,30 +6460,6 @@ dependencies = [
|
|||||||
"portable-atomic-util",
|
"portable-atomic-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rkyv"
|
|
||||||
version = "0.8.13"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8b2e88acca7157d83d789836a3987dafc12bc3d88a050e54b8fe9ea4aaa29d20"
|
|
||||||
dependencies = [
|
|
||||||
"munge",
|
|
||||||
"ptr_meta",
|
|
||||||
"rancor",
|
|
||||||
"rend",
|
|
||||||
"rkyv_derive",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rkyv_derive"
|
|
||||||
version = "0.8.13"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7f6dffea3c91fa91a3c0fc8a061b0e27fef25c6304728038a6d6bcb1c58ba9bd"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 2.0.113",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rs-snowflake"
|
name = "rs-snowflake"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
|
|||||||
@ -63,7 +63,6 @@ flexi_logger = "0.31.7"
|
|||||||
log = "0.4.29"
|
log = "0.4.29"
|
||||||
|
|
||||||
smartstring = { version = "1.0.1" }
|
smartstring = { version = "1.0.1" }
|
||||||
compact_str = { version = "0.9.0", features = ["serde"] }
|
|
||||||
|
|
||||||
serde = { version = "1.0.228" }
|
serde = { version = "1.0.228" }
|
||||||
serde_json = { version = "1.0.148" }
|
serde_json = { version = "1.0.148" }
|
||||||
|
|||||||
@ -6,8 +6,9 @@ edition = "2024"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
log = { workspace = true }
|
log = { workspace = true }
|
||||||
tokio = { workspace = true }
|
tokio = { workspace = true }
|
||||||
compact_str = { workspace = true }
|
|
||||||
flexi_logger = { workspace = true }
|
flexi_logger = { workspace = true }
|
||||||
|
nu-ansi-term = { version = "0.50", optional = true }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
|
color = ["nu-ansi-term"]
|
||||||
|
|||||||
@ -1,14 +1,18 @@
|
|||||||
use compact_str::CompactString;
|
use std::borrow::Cow;
|
||||||
|
use std::{fmt, sync::Arc};
|
||||||
|
use std::{io::Write, thread};
|
||||||
|
|
||||||
use flexi_logger::DeferredNow;
|
use flexi_logger::DeferredNow;
|
||||||
use flexi_logger::filter::LogLineFilter;
|
use flexi_logger::filter::LogLineFilter;
|
||||||
use flexi_logger::writers::FileLogWriter;
|
use flexi_logger::writers::FileLogWriter;
|
||||||
use flexi_logger::writers::LogWriter as _;
|
use flexi_logger::writers::LogWriter as _;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
use log::Record;
|
use log::{LevelFilter, Record};
|
||||||
use std::{fmt, sync::Arc};
|
#[cfg(feature = "color")]
|
||||||
use tokio::sync::{Mutex, MutexGuard};
|
use nu_ansi_term::Color;
|
||||||
|
use tokio::sync::{RwLock, RwLockReadGuard};
|
||||||
|
|
||||||
pub type SharedWriter = Arc<Mutex<FileLogWriter>>;
|
pub type SharedWriter = Arc<RwLock<FileLogWriter>>;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
pub enum Type {
|
pub enum Type {
|
||||||
@ -85,10 +89,10 @@ macro_rules! logging_error {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn write_sidecar_log(
|
pub fn write_sidecar_log(
|
||||||
writer: MutexGuard<'_, FileLogWriter>,
|
writer: RwLockReadGuard<'_, FileLogWriter>,
|
||||||
now: &mut DeferredNow,
|
now: &mut DeferredNow,
|
||||||
level: Level,
|
level: Level,
|
||||||
message: &CompactString,
|
message: &str,
|
||||||
) {
|
) {
|
||||||
let args = format_args!("{}", message);
|
let args = format_args!("{}", message);
|
||||||
|
|
||||||
@ -127,3 +131,66 @@ impl<'a> LogLineFilter for NoModuleFilter<'a> {
|
|||||||
writer.write(now, record)
|
writer.write(now, record)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn level_filter_to_string(log_level: &LevelFilter) -> Cow<'static, str> {
|
||||||
|
#[cfg(feature = "color")]
|
||||||
|
{
|
||||||
|
match log_level {
|
||||||
|
LevelFilter::Off => Cow::Owned(Color::Fixed(8).paint("OFF").to_string()),
|
||||||
|
LevelFilter::Error => Cow::Owned(Color::Red.paint("ERROR").to_string()),
|
||||||
|
LevelFilter::Warn => Cow::Owned(Color::Yellow.paint("WARN ").to_string()),
|
||||||
|
LevelFilter::Info => Cow::Owned(Color::Green.paint("INFO ").to_string()),
|
||||||
|
LevelFilter::Debug => Cow::Owned(Color::Blue.paint("DEBUG").to_string()),
|
||||||
|
LevelFilter::Trace => Cow::Owned(Color::Purple.paint("TRACE").to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(not(feature = "color"))]
|
||||||
|
{
|
||||||
|
match log_level {
|
||||||
|
LevelFilter::Off => Cow::Borrowed("OFF"),
|
||||||
|
LevelFilter::Error => Cow::Borrowed("ERROR"),
|
||||||
|
LevelFilter::Warn => Cow::Borrowed("WARN "),
|
||||||
|
LevelFilter::Info => Cow::Borrowed("INFO "),
|
||||||
|
LevelFilter::Debug => Cow::Borrowed("DEBUG"),
|
||||||
|
LevelFilter::Trace => Cow::Borrowed("TRACE"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn console_format(w: &mut dyn Write, now: &mut DeferredNow, record: &Record) -> std::io::Result<()> {
|
||||||
|
let current_thread = thread::current();
|
||||||
|
let thread_name = current_thread.name().unwrap_or("unnamed");
|
||||||
|
|
||||||
|
let level = level_filter_to_string(&record.level().to_level_filter());
|
||||||
|
|
||||||
|
let now = now.format("%H:%M:%S%.3f");
|
||||||
|
#[cfg(feature = "color")]
|
||||||
|
let now = Color::DarkGray.paint(Cow::from(now.to_string()));
|
||||||
|
|
||||||
|
let line = record.line().map_or(0, |l| l);
|
||||||
|
let module = record.module_path().unwrap_or("<unnamed>");
|
||||||
|
let module_line = Cow::from(format!("{}:{}", module, line));
|
||||||
|
|
||||||
|
#[cfg(feature = "color")]
|
||||||
|
let module_line = Color::Purple.paint(module_line);
|
||||||
|
|
||||||
|
let thread_name = Cow::from(format!("T{{{}}}", thread_name));
|
||||||
|
#[cfg(feature = "color")]
|
||||||
|
let thread_name = Color::Cyan.paint(thread_name);
|
||||||
|
|
||||||
|
write!(w, "{} {} {} {} {}", now, level, module_line, thread_name, record.args(),)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn file_format_with_level(w: &mut dyn Write, now: &mut DeferredNow, record: &Record) -> std::io::Result<()> {
|
||||||
|
write!(
|
||||||
|
w,
|
||||||
|
"[{}] {} {}",
|
||||||
|
now.format("%Y-%m-%d %H:%M:%S%.3f"),
|
||||||
|
record.level(),
|
||||||
|
record.args(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn file_format_without_level(w: &mut dyn Write, now: &mut DeferredNow, record: &Record) -> std::io::Result<()> {
|
||||||
|
write!(w, "[{}] {}", now.format("%Y-%m-%d %H:%M:%S%.3f"), record.args(),)
|
||||||
|
}
|
||||||
|
|||||||
@ -17,7 +17,7 @@ crate-type = ["staticlib", "cdylib", "rlib"]
|
|||||||
[features]
|
[features]
|
||||||
default = ["custom-protocol"]
|
default = ["custom-protocol"]
|
||||||
custom-protocol = ["tauri/custom-protocol"]
|
custom-protocol = ["tauri/custom-protocol"]
|
||||||
verge-dev = ["clash_verge_logger/color"]
|
verge-dev = ["clash-verge-logging/color"]
|
||||||
tauri-dev = []
|
tauri-dev = []
|
||||||
tokio-trace = ["console-subscriber"]
|
tokio-trace = ["console-subscriber"]
|
||||||
clippy = ["tauri/test"]
|
clippy = ["tauri/test"]
|
||||||
@ -48,7 +48,6 @@ tauri = { workspace = true, features = [
|
|||||||
parking_lot = { workspace = true }
|
parking_lot = { workspace = true }
|
||||||
anyhow = { workspace = true }
|
anyhow = { workspace = true }
|
||||||
tokio = { workspace = true }
|
tokio = { workspace = true }
|
||||||
compact_str = { workspace = true }
|
|
||||||
flexi_logger = { workspace = true }
|
flexi_logger = { workspace = true }
|
||||||
log = { workspace = true }
|
log = { workspace = true }
|
||||||
serde = { workspace = true, features = ["derive"] }
|
serde = { workspace = true, features = ["derive"] }
|
||||||
@ -97,11 +96,10 @@ tauri-plugin-http = "2.5.4"
|
|||||||
console-subscriber = { version = "0.5.0", optional = true }
|
console-subscriber = { version = "0.5.0", optional = true }
|
||||||
tauri-plugin-devtools = { version = "2.0.1" }
|
tauri-plugin-devtools = { version = "2.0.1" }
|
||||||
tauri-plugin-mihomo = { git = "https://github.com/clash-verge-rev/tauri-plugin-mihomo" }
|
tauri-plugin-mihomo = { git = "https://github.com/clash-verge-rev/tauri-plugin-mihomo" }
|
||||||
clash_verge_logger = { git = "https://github.com/clash-verge-rev/clash-verge-logger" }
|
|
||||||
async-trait = "0.1.89"
|
async-trait = "0.1.89"
|
||||||
clash_verge_service_ipc = { version = "2.0.28", features = [
|
clash_verge_service_ipc = { version = "2.0.29", features = [
|
||||||
"client",
|
"client",
|
||||||
], git = "https://github.com/clash-verge-rev/clash-verge-service-ipc" }
|
], git = "https://github.com/clash-verge-rev/clash-verge-service-ipc", branch = "refactor/remove-logs-record" }
|
||||||
arc-swap = "1.8.0"
|
arc-swap = "1.8.0"
|
||||||
rust_iso3166 = "0.1.14"
|
rust_iso3166 = "0.1.14"
|
||||||
dark-light = "2.0.0"
|
dark-light = "2.0.0"
|
||||||
|
|||||||
@ -8,7 +8,6 @@ use crate::{
|
|||||||
core::{CoreManager, handle, validate::CoreConfigValidator},
|
core::{CoreManager, handle, validate::CoreConfigValidator},
|
||||||
};
|
};
|
||||||
use clash_verge_logging::{Type, logging, logging_error};
|
use clash_verge_logging::{Type, logging, logging_error};
|
||||||
use compact_str::CompactString;
|
|
||||||
use serde_yaml_ng::Mapping;
|
use serde_yaml_ng::Mapping;
|
||||||
use smartstring::alias::String;
|
use smartstring::alias::String;
|
||||||
use tokio::fs;
|
use tokio::fs;
|
||||||
@ -243,9 +242,3 @@ pub async fn validate_dns_config() -> CmdResult<(bool, String)> {
|
|||||||
.await
|
.await
|
||||||
.stringify_err()
|
.stringify_err()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
|
||||||
pub async fn get_clash_logs() -> CmdResult<Vec<CompactString>> {
|
|
||||||
let logs = CoreManager::global().get_clash_logs().await.unwrap_or_default();
|
|
||||||
Ok(logs)
|
|
||||||
}
|
|
||||||
|
|||||||
@ -9,7 +9,6 @@ use std::{
|
|||||||
use anyhow::{Result, bail};
|
use anyhow::{Result, bail};
|
||||||
use clash_verge_logging::{Type, logging};
|
use clash_verge_logging::{Type, logging};
|
||||||
use clash_verge_service_ipc::WriterConfig;
|
use clash_verge_service_ipc::WriterConfig;
|
||||||
use compact_str::CompactString;
|
|
||||||
use flexi_logger::{
|
use flexi_logger::{
|
||||||
Cleanup, Criterion, DeferredNow, FileSpec, LogSpecBuilder, LogSpecification, LoggerHandle,
|
Cleanup, Criterion, DeferredNow, FileSpec, LogSpecBuilder, LogSpecification, LoggerHandle,
|
||||||
writers::{FileLogWriter, FileLogWriterBuilder, LogWriter as _},
|
writers::{FileLogWriter, FileLogWriterBuilder, LogWriter as _},
|
||||||
@ -75,8 +74,8 @@ impl Logger {
|
|||||||
let logger = flexi_logger::Logger::with(log_spec)
|
let logger = flexi_logger::Logger::with(log_spec)
|
||||||
.log_to_file(FileSpec::default().directory(log_dir).basename(""))
|
.log_to_file(FileSpec::default().directory(log_dir).basename(""))
|
||||||
.duplicate_to_stdout(log_level.into())
|
.duplicate_to_stdout(log_level.into())
|
||||||
.format(clash_verge_logger::console_format)
|
.format(clash_verge_logging::console_format)
|
||||||
.format_for_files(clash_verge_logger::file_format_with_level)
|
.format_for_files(clash_verge_logging::file_format_with_level)
|
||||||
.rotate(
|
.rotate(
|
||||||
Criterion::Size(log_max_size * 1024),
|
Criterion::Size(log_max_size * 1024),
|
||||||
flexi_logger::Naming::TimestampsCustomFormat {
|
flexi_logger::Naming::TimestampsCustomFormat {
|
||||||
@ -183,7 +182,7 @@ impl Logger {
|
|||||||
.basename("sidecar")
|
.basename("sidecar")
|
||||||
.suppress_timestamp(),
|
.suppress_timestamp(),
|
||||||
)
|
)
|
||||||
.format(clash_verge_logger::file_format_without_level)
|
.format(clash_verge_logging::file_format_without_level)
|
||||||
.rotate(
|
.rotate(
|
||||||
Criterion::Size(log_max_size * 1024),
|
Criterion::Size(log_max_size * 1024),
|
||||||
flexi_logger::Naming::TimestampsCustomFormat {
|
flexi_logger::Naming::TimestampsCustomFormat {
|
||||||
@ -195,7 +194,7 @@ impl Logger {
|
|||||||
.try_build()?)
|
.try_build()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn writer_sidecar_log(&self, level: Level, message: &CompactString) {
|
pub fn writer_sidecar_log(&self, level: Level, message: &str) {
|
||||||
if let Some(writer) = self.sidecar_file_writer.read().as_ref() {
|
if let Some(writer) = self.sidecar_file_writer.read().as_ref() {
|
||||||
let mut now = DeferredNow::default();
|
let mut now = DeferredNow::default();
|
||||||
let args = format_args!("{}", message);
|
let args = format_args!("{}", message);
|
||||||
|
|||||||
@ -2,7 +2,6 @@ use super::{CoreManager, RunningMode};
|
|||||||
use crate::cmd::StringifyErr as _;
|
use crate::cmd::StringifyErr as _;
|
||||||
use crate::config::{Config, IVerge};
|
use crate::config::{Config, IVerge};
|
||||||
use crate::core::handle::Handle;
|
use crate::core::handle::Handle;
|
||||||
use crate::core::manager::CLASH_LOGGER;
|
|
||||||
use crate::core::service::{SERVICE_MANAGER, ServiceStatus};
|
use crate::core::service::{SERVICE_MANAGER, ServiceStatus};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use clash_verge_logging::{Type, logging};
|
use clash_verge_logging::{Type, logging};
|
||||||
@ -24,7 +23,6 @@ impl CoreManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn stop_core(&self) -> Result<()> {
|
pub async fn stop_core(&self) -> Result<()> {
|
||||||
CLASH_LOGGER.clear_logs().await;
|
|
||||||
defer! {
|
defer! {
|
||||||
self.after_core_process();
|
self.after_core_process();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,15 +4,11 @@ mod state;
|
|||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use arc_swap::{ArcSwap, ArcSwapOption};
|
use arc_swap::{ArcSwap, ArcSwapOption};
|
||||||
use clash_verge_logger::AsyncLogger;
|
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use std::{fmt, sync::Arc, time::Instant};
|
use std::{fmt, sync::Arc, time::Instant};
|
||||||
use tauri_plugin_shell::process::CommandChild;
|
use tauri_plugin_shell::process::CommandChild;
|
||||||
|
|
||||||
use crate::singleton;
|
use crate::singleton;
|
||||||
|
|
||||||
pub(crate) static CLASH_LOGGER: Lazy<Arc<AsyncLogger>> = Lazy::new(|| Arc::new(AsyncLogger::new()));
|
|
||||||
|
|
||||||
#[derive(Debug, serde::Serialize, PartialEq, Eq)]
|
#[derive(Debug, serde::Serialize, PartialEq, Eq)]
|
||||||
pub enum RunningMode {
|
pub enum RunningMode {
|
||||||
Service,
|
Service,
|
||||||
|
|||||||
@ -1,27 +1,20 @@
|
|||||||
|
use std::borrow::Cow;
|
||||||
|
|
||||||
use super::{CoreManager, RunningMode};
|
use super::{CoreManager, RunningMode};
|
||||||
use crate::{
|
use crate::{
|
||||||
AsyncHandler,
|
AsyncHandler,
|
||||||
config::{Config, IClashTemp},
|
config::{Config, IClashTemp},
|
||||||
core::{handle, logger::Logger, manager::CLASH_LOGGER, service},
|
core::{handle, logger::Logger, service},
|
||||||
logging,
|
logging,
|
||||||
utils::dirs,
|
utils::dirs,
|
||||||
};
|
};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use clash_verge_logging::Type;
|
use clash_verge_logging::Type;
|
||||||
use compact_str::CompactString;
|
|
||||||
use log::Level;
|
use log::Level;
|
||||||
use scopeguard::defer;
|
use scopeguard::defer;
|
||||||
use tauri_plugin_shell::ShellExt as _;
|
use tauri_plugin_shell::ShellExt as _;
|
||||||
|
|
||||||
impl CoreManager {
|
impl CoreManager {
|
||||||
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(CLASH_LOGGER.get_logs().await),
|
|
||||||
RunningMode::NotRunning => Ok(Vec::new()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(super) async fn start_core_by_sidecar(&self) -> Result<()> {
|
pub(super) async fn start_core_by_sidecar(&self) -> Result<()> {
|
||||||
logging!(info, Type::Core, "Starting core in sidecar mode");
|
logging!(info, Type::Core, "Starting core in sidecar mode");
|
||||||
|
|
||||||
@ -64,20 +57,18 @@ impl CoreManager {
|
|||||||
match event {
|
match event {
|
||||||
tauri_plugin_shell::process::CommandEvent::Stdout(line)
|
tauri_plugin_shell::process::CommandEvent::Stdout(line)
|
||||||
| tauri_plugin_shell::process::CommandEvent::Stderr(line) => {
|
| tauri_plugin_shell::process::CommandEvent::Stderr(line) => {
|
||||||
let message = CompactString::from(String::from_utf8_lossy(&line).as_ref());
|
let message = String::from_utf8_lossy(&line);
|
||||||
Logger::global().writer_sidecar_log(Level::Error, &message);
|
Logger::global().writer_sidecar_log(Level::Error, &message);
|
||||||
CLASH_LOGGER.append_log(message).await;
|
|
||||||
}
|
}
|
||||||
tauri_plugin_shell::process::CommandEvent::Terminated(term) => {
|
tauri_plugin_shell::process::CommandEvent::Terminated(term) => {
|
||||||
let message = if let Some(code) = term.code {
|
let message = if let Some(code) = term.code {
|
||||||
CompactString::from(format!("Process terminated with code: {}", code))
|
Cow::Owned(format!("Process terminated with code: {}", code))
|
||||||
} else if let Some(signal) = term.signal {
|
} else if let Some(signal) = term.signal {
|
||||||
CompactString::from(format!("Process terminated by signal: {}", signal))
|
Cow::Owned(format!("Process terminated by signal: {}", signal))
|
||||||
} else {
|
} else {
|
||||||
CompactString::from("Process terminated")
|
Cow::Borrowed("Process terminated")
|
||||||
};
|
};
|
||||||
Logger::global().writer_sidecar_log(Level::Info, &message);
|
Logger::global().writer_sidecar_log(Level::Info, &message);
|
||||||
CLASH_LOGGER.clear_logs().await;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|||||||
@ -6,7 +6,6 @@ use crate::{
|
|||||||
use anyhow::{Context as _, Result, bail};
|
use anyhow::{Context as _, Result, bail};
|
||||||
use clash_verge_logging::{Type, logging, logging_error};
|
use clash_verge_logging::{Type, logging, logging_error};
|
||||||
use clash_verge_service_ipc::CoreConfig;
|
use clash_verge_service_ipc::CoreConfig;
|
||||||
use compact_str::CompactString;
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use std::{
|
use std::{
|
||||||
env::current_exe,
|
env::current_exe,
|
||||||
@ -343,23 +342,6 @@ 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<Vec<CompactString>> {
|
|
||||||
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)");
|
||||||
|
|||||||
@ -179,7 +179,6 @@ mod app_init {
|
|||||||
cmd::check_dns_config_exists,
|
cmd::check_dns_config_exists,
|
||||||
cmd::get_dns_config_content,
|
cmd::get_dns_config_content,
|
||||||
cmd::validate_dns_config,
|
cmd::validate_dns_config,
|
||||||
cmd::get_clash_logs,
|
|
||||||
cmd::get_verge_config,
|
cmd::get_verge_config,
|
||||||
cmd::patch_verge_config,
|
cmd::patch_verge_config,
|
||||||
cmd::test_delay,
|
cmd::test_delay,
|
||||||
|
|||||||
@ -3,8 +3,6 @@ import { useEffect, useRef } from "react";
|
|||||||
import { mutate } from "swr";
|
import { mutate } from "swr";
|
||||||
import { MihomoWebSocket, type LogLevel } from "tauri-plugin-mihomo-api";
|
import { MihomoWebSocket, type LogLevel } from "tauri-plugin-mihomo-api";
|
||||||
|
|
||||||
import { getClashLogs } from "@/services/cmds";
|
|
||||||
|
|
||||||
import { useClashLog } from "./use-clash-log";
|
import { useClashLog } from "./use-clash-log";
|
||||||
import { useMihomoWsSubscription } from "./use-mihomo-ws-subscription";
|
import { useMihomoWsSubscription } from "./use-mihomo-ws-subscription";
|
||||||
|
|
||||||
@ -24,15 +22,6 @@ const LOG_LEVEL_FILTERS: Record<LogLevel, LogType[]> = {
|
|||||||
const clampLogs = (logs: ILogItem[]): ILogItem[] =>
|
const clampLogs = (logs: ILogItem[]): ILogItem[] =>
|
||||||
logs.length > MAX_LOG_NUM ? logs.slice(-MAX_LOG_NUM) : logs;
|
logs.length > MAX_LOG_NUM ? logs.slice(-MAX_LOG_NUM) : logs;
|
||||||
|
|
||||||
const filterLogsByLevel = (
|
|
||||||
logs: ILogItem[],
|
|
||||||
allowedTypes: LogType[],
|
|
||||||
): ILogItem[] => {
|
|
||||||
if (allowedTypes.length === 0) return [];
|
|
||||||
if (allowedTypes.length === DEFAULT_LOG_TYPES.length) return logs;
|
|
||||||
return logs.filter((log) => allowedTypes.includes(log.type));
|
|
||||||
};
|
|
||||||
|
|
||||||
const appendLogs = (
|
const appendLogs = (
|
||||||
current: ILogItem[] | undefined,
|
current: ILogItem[] | undefined,
|
||||||
incoming: ILogItem[],
|
incoming: ILogItem[],
|
||||||
@ -99,10 +88,7 @@ export const useLogData = () => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
async onConnected() {
|
async onConnected() {
|
||||||
const logs = await getClashLogs();
|
console.debug("[use-log-data] Log WebSocket connected");
|
||||||
if (isMounted()) {
|
|
||||||
next(null, clampLogs(filterLogsByLevel(logs, allowedTypes)));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
cleanup: clearFlushTimer,
|
cleanup: clearFlushTimer,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import { invoke } from "@tauri-apps/api/core";
|
import { invoke } from "@tauri-apps/api/core";
|
||||||
import dayjs from "dayjs";
|
|
||||||
import { getProxies, getProxyProviders } from "tauri-plugin-mihomo-api";
|
import { getProxies, getProxyProviders } from "tauri-plugin-mihomo-api";
|
||||||
|
|
||||||
import { showNotice } from "@/services/notice-service";
|
import { showNotice } from "@/services/notice-service";
|
||||||
@ -220,33 +219,6 @@ export async function calcuProxyProviders() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getClashLogs() {
|
|
||||||
const regex = /time="(.+?)"\s+level=(.+?)\s+msg="(.+?)"/;
|
|
||||||
const newRegex = /(.+?)\s+(.+?)\s+(.+)/;
|
|
||||||
const logs = await invoke<string[]>("get_clash_logs");
|
|
||||||
|
|
||||||
return logs.reduce<ILogItem[]>((acc, log) => {
|
|
||||||
const result = log.match(regex);
|
|
||||||
if (result) {
|
|
||||||
const [_, _time, type, payload] = result;
|
|
||||||
const time = dayjs(_time).format("MM-DD HH:mm:ss");
|
|
||||||
acc.push({ time, type, payload });
|
|
||||||
return acc;
|
|
||||||
}
|
|
||||||
|
|
||||||
const result2 = log.match(newRegex);
|
|
||||||
if (result2) {
|
|
||||||
const [_, time, type, payload] = result2;
|
|
||||||
acc.push({ time, type, payload });
|
|
||||||
}
|
|
||||||
return acc;
|
|
||||||
}, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function clearLogs() {
|
|
||||||
return invoke<void>("clear_logs");
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getVergeConfig() {
|
export async function getVergeConfig() {
|
||||||
return invoke<IVergeConfig>("get_verge_config");
|
return invoke<IVergeConfig>("get_verge_config");
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user