feat: support app log level settings
This commit is contained in:
parent
6c1ab6002d
commit
b307b9a66b
@ -1,5 +1,6 @@
|
|||||||
use crate::utils::{dirs, help};
|
use crate::utils::{dirs, help};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use log::LevelFilter;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
/// ### `verge.yaml` schema
|
/// ### `verge.yaml` schema
|
||||||
@ -8,6 +9,10 @@ pub struct IVerge {
|
|||||||
/// app listening port for app singleton
|
/// app listening port for app singleton
|
||||||
pub app_singleton_port: Option<u16>,
|
pub app_singleton_port: Option<u16>,
|
||||||
|
|
||||||
|
/// app log level
|
||||||
|
/// `trace` `debug` `info` `warn` `error`
|
||||||
|
pub app_log_level: Option<String>,
|
||||||
|
|
||||||
// i18n
|
// i18n
|
||||||
pub language: Option<String>,
|
pub language: Option<String>,
|
||||||
|
|
||||||
@ -144,6 +149,7 @@ impl IVerge {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
patch!(app_log_level);
|
||||||
patch!(language);
|
patch!(language);
|
||||||
patch!(theme_mode);
|
patch!(theme_mode);
|
||||||
patch!(theme_blur);
|
patch!(theme_blur);
|
||||||
@ -182,4 +188,20 @@ impl IVerge {
|
|||||||
Err(_) => SERVER_PORT, // 这里就不log错误了
|
Err(_) => SERVER_PORT, // 这里就不log错误了
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 获取日志等级
|
||||||
|
pub fn get_log_level(&self) -> LevelFilter {
|
||||||
|
if let Some(level) = self.app_log_level.as_ref() {
|
||||||
|
match level.to_lowercase().as_str() {
|
||||||
|
"trace" => LevelFilter::Trace,
|
||||||
|
"debug" => LevelFilter::Debug,
|
||||||
|
"info" => LevelFilter::Info,
|
||||||
|
"warn" => LevelFilter::Warn,
|
||||||
|
"error" => LevelFilter::Error,
|
||||||
|
_ => LevelFilter::Info,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LevelFilter::Info
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ use chrono::Local;
|
|||||||
use log::LevelFilter;
|
use log::LevelFilter;
|
||||||
use log4rs::append::console::ConsoleAppender;
|
use log4rs::append::console::ConsoleAppender;
|
||||||
use log4rs::append::file::FileAppender;
|
use log4rs::append::file::FileAppender;
|
||||||
use log4rs::config::{Appender, Config, Logger, Root};
|
use log4rs::config::{Appender, Logger, Root};
|
||||||
use log4rs::encode::pattern::PatternEncoder;
|
use log4rs::encode::pattern::PatternEncoder;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use tauri::PackageInfo;
|
use tauri::PackageInfo;
|
||||||
@ -17,35 +17,49 @@ fn init_log() -> Result<()> {
|
|||||||
let _ = fs::create_dir_all(&log_dir);
|
let _ = fs::create_dir_all(&log_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let log_level = Config::verge().data().get_log_level();
|
||||||
|
|
||||||
let local_time = Local::now().format("%Y-%m-%d-%H%M").to_string();
|
let local_time = Local::now().format("%Y-%m-%d-%H%M").to_string();
|
||||||
let log_file = format!("{}.log", local_time);
|
let log_file = format!("{}.log", local_time);
|
||||||
let log_file = log_dir.join(log_file);
|
let log_file = log_dir.join(log_file);
|
||||||
|
|
||||||
#[cfg(feature = "verge-dev")]
|
let log_pattern = match log_level {
|
||||||
let time_format = "{d(%Y-%m-%d %H:%M:%S)} {l} - {M} {m}{n}";
|
LevelFilter::Trace => "{d(%Y-%m-%d %H:%M:%S)} {l} [{M}] - {m}{n}",
|
||||||
#[cfg(not(feature = "verge-dev"))]
|
_ => "{d(%Y-%m-%d %H:%M:%S)} {l} - {m}{n}",
|
||||||
let time_format = "{d(%Y-%m-%d %H:%M:%S)} {l} - {m}{n}";
|
};
|
||||||
|
|
||||||
let encode = Box::new(PatternEncoder::new(time_format));
|
let encode = Box::new(PatternEncoder::new(log_pattern));
|
||||||
|
|
||||||
let stdout = ConsoleAppender::builder().encoder(encode.clone()).build();
|
let stdout = ConsoleAppender::builder().encoder(encode.clone()).build();
|
||||||
let tofile = FileAppender::builder().encoder(encode).build(log_file)?;
|
let tofile = FileAppender::builder().encoder(encode).build(log_file)?;
|
||||||
|
|
||||||
#[cfg(feature = "verge-dev")]
|
let mut logger_builder = Logger::builder();
|
||||||
let level = LevelFilter::Debug;
|
let mut root_builder = Root::builder();
|
||||||
#[cfg(not(feature = "verge-dev"))]
|
|
||||||
let level = LevelFilter::Info;
|
|
||||||
|
|
||||||
let config = Config::builder()
|
let log_more = log_level == LevelFilter::Trace || log_level == LevelFilter::Debug;
|
||||||
|
|
||||||
|
#[cfg(feature = "verge-dev")]
|
||||||
|
{
|
||||||
|
logger_builder = logger_builder.appenders(["file", "stdout"]);
|
||||||
|
if log_more {
|
||||||
|
root_builder = root_builder.appenders(["file", "stdout"]);
|
||||||
|
} else {
|
||||||
|
root_builder = root_builder.appenders(["stdout"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(not(feature = "verge-dev"))]
|
||||||
|
{
|
||||||
|
logger_builder = logger_builder.appenders(["file"]);
|
||||||
|
if log_more {
|
||||||
|
root_builder = root_builder.appenders(["file"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let (config, _) = log4rs::config::Config::builder()
|
||||||
.appender(Appender::builder().build("stdout", Box::new(stdout)))
|
.appender(Appender::builder().build("stdout", Box::new(stdout)))
|
||||||
.appender(Appender::builder().build("file", Box::new(tofile)))
|
.appender(Appender::builder().build("file", Box::new(tofile)))
|
||||||
.logger(
|
.logger(logger_builder.additive(false).build("app", log_level))
|
||||||
Logger::builder()
|
.build_lossy(root_builder.build(log_level));
|
||||||
.appenders(["file", "stdout"])
|
|
||||||
.additive(false)
|
|
||||||
.build("app", level),
|
|
||||||
)
|
|
||||||
.build(Root::builder().appender("stdout").build(LevelFilter::Info))?;
|
|
||||||
|
|
||||||
log4rs::init_config(config)?;
|
log4rs::init_config(config)?;
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ export const MiscViewer = forwardRef<DialogRef>((props, ref) => {
|
|||||||
|
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
const [values, setValues] = useState({
|
const [values, setValues] = useState({
|
||||||
|
appLogLevel: "info",
|
||||||
autoCloseConnection: false,
|
autoCloseConnection: false,
|
||||||
enableClashFields: true,
|
enableClashFields: true,
|
||||||
enableBuiltinEnhanced: true,
|
enableBuiltinEnhanced: true,
|
||||||
@ -30,6 +31,7 @@ export const MiscViewer = forwardRef<DialogRef>((props, ref) => {
|
|||||||
open: () => {
|
open: () => {
|
||||||
setOpen(true);
|
setOpen(true);
|
||||||
setValues({
|
setValues({
|
||||||
|
appLogLevel: verge?.app_log_level ?? "info",
|
||||||
autoCloseConnection: verge?.auto_close_connection ?? false,
|
autoCloseConnection: verge?.auto_close_connection ?? false,
|
||||||
enableClashFields: verge?.enable_clash_fields ?? true,
|
enableClashFields: verge?.enable_clash_fields ?? true,
|
||||||
enableBuiltinEnhanced: verge?.enable_builtin_enhanced ?? true,
|
enableBuiltinEnhanced: verge?.enable_builtin_enhanced ?? true,
|
||||||
@ -43,6 +45,7 @@ export const MiscViewer = forwardRef<DialogRef>((props, ref) => {
|
|||||||
const onSave = useLockFn(async () => {
|
const onSave = useLockFn(async () => {
|
||||||
try {
|
try {
|
||||||
await patchVerge({
|
await patchVerge({
|
||||||
|
app_log_level: values.appLogLevel,
|
||||||
auto_close_connection: values.autoCloseConnection,
|
auto_close_connection: values.autoCloseConnection,
|
||||||
enable_clash_fields: values.enableClashFields,
|
enable_clash_fields: values.enableClashFields,
|
||||||
enable_builtin_enhanced: values.enableBuiltinEnhanced,
|
enable_builtin_enhanced: values.enableBuiltinEnhanced,
|
||||||
@ -67,6 +70,27 @@ export const MiscViewer = forwardRef<DialogRef>((props, ref) => {
|
|||||||
onOk={onSave}
|
onOk={onSave}
|
||||||
>
|
>
|
||||||
<List>
|
<List>
|
||||||
|
<ListItem sx={{ padding: "5px 2px" }}>
|
||||||
|
<ListItemText primary="App Log Level" />
|
||||||
|
<Select
|
||||||
|
size="small"
|
||||||
|
sx={{ width: 100, "> div": { py: "7.5px" } }}
|
||||||
|
value={values.appLogLevel}
|
||||||
|
onChange={(e) => {
|
||||||
|
setValues((v) => ({
|
||||||
|
...v,
|
||||||
|
appLogLevel: e.target.value as string,
|
||||||
|
}));
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{["trace", "debug", "info", "warn", "error"].map((i) => (
|
||||||
|
<MenuItem value={i} key={i}>
|
||||||
|
{i}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
</ListItem>
|
||||||
|
|
||||||
<ListItem sx={{ padding: "5px 2px" }}>
|
<ListItem sx={{ padding: "5px 2px" }}>
|
||||||
<ListItemText primary="Auto Close Connections" />
|
<ListItemText primary="Auto Close Connections" />
|
||||||
<Switch
|
<Switch
|
||||||
|
1
src/services/types.d.ts
vendored
1
src/services/types.d.ts
vendored
@ -153,6 +153,7 @@ interface IProfilesConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface IVergeConfig {
|
interface IVergeConfig {
|
||||||
|
app_log_level?: "trace" | "debug" | "info" | "warn" | "error" | string;
|
||||||
language?: string;
|
language?: string;
|
||||||
clash_core?: string;
|
clash_core?: string;
|
||||||
theme_mode?: "light" | "dark" | "system";
|
theme_mode?: "light" | "dark" | "system";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user