From 899e109f6ef3a32c25f75aec5690bb800c3466ac Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 1 Dec 2025 22:21:57 +0800 Subject: Add --show-log flag and refactor vault setup - Add `--show-log` flag to override profile logger setting - Add validation for conflicting `--no-log` and `--show-log` flags - Refactor `Vault::setup_vault` to accept vault name parameter - Update logger initialization to respect configured log level - Add new dependencies: `whoami`, `redox_syscall`, `wasite`, `web-sys` - Add error message for conflicting log flags in locales --- Cargo.lock | 29 +++++++++++++++++ locales/help_docs/en.yml | 12 +++++++ locales/help_docs/zh-CN.yml | 12 +++++++ src/bin/jvv.rs | 76 +++++++++++++++++---------------------------- src/utils/logger.rs | 16 +++++++--- 5 files changed, 94 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a66de49..aa9b047 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1003,6 +1003,7 @@ checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags 2.9.4", "libc", + "redox_syscall", ] [[package]] @@ -2021,6 +2022,7 @@ dependencies = [ "uuid", "vcs_docs", "walkdir", + "whoami", "winapi", ] @@ -2068,6 +2070,12 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.104" @@ -2127,6 +2135,27 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", + "web-sys", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/locales/help_docs/en.yml b/locales/help_docs/en.yml index 25c2f7f..08bd95d 100644 --- a/locales/help_docs/en.yml +++ b/locales/help_docs/en.yml @@ -117,6 +117,18 @@ jvv: Server forced to close due to error! Error message: %{error} + wtf_show_log_and_no_log: | + You cannot both show and hide log output at the same time! + + " + This reminds me of the old saying: 'You can't have your cake and eat it too.' + Or perhaps the classic logical puzzle: 'This statement is false.' + " + + Your command is a paradox: show the logs, and do not show the logs. Which contradictory order should I follow? + + **Tip**: Use `jvv listen --no-log` or `jvv listen --show-log` to override the default Logger setting. + success: here: info: | diff --git a/locales/help_docs/zh-CN.yml b/locales/help_docs/zh-CN.yml index e6bdfc7..82ae6af 100644 --- a/locales/help_docs/zh-CN.yml +++ b/locales/help_docs/zh-CN.yml @@ -114,6 +114,18 @@ jvv: 服务端被错误强制关闭! 错误信息:%{error} + wtf_show_log_and_no_log: | + 您无法同时选择显示和不显示输出信息! + + “ + 这让我想起那个古老的寓言:一位卖矛和盾的商人,先是夸口他的盾‘任何矛都刺不穿’, + 接着又宣称他的矛 ‘能刺穿任何盾’。当被问到 ’用你的矛刺你的盾会怎样’ 时,他哑口无言。 + ” + + 您的指令就像这则故事,既要显示日志,又要不显示日志。我该遵循哪个矛盾的命令呢? + + **提示**:使用 `jvv listen --no-log` 或 `jvv listen --show-log` 覆盖默认 Logger 设置运行 + success: here: info: | diff --git a/src/bin/jvv.rs b/src/bin/jvv.rs index db72a53..b9a1d74 100644 --- a/src/bin/jvv.rs +++ b/src/bin/jvv.rs @@ -174,10 +174,14 @@ struct ListenArgs { #[arg(short, long)] help: bool, - /// Disable logging + /// Disable logging (Override profile) #[arg(short, long)] no_log: bool, + /// Show logging (Override profile) + #[arg(short, long)] + show_log: bool, + /// Custom port #[arg(short, long)] port: Option, @@ -465,22 +469,7 @@ async fn jvv_init(_args: InitVaultArgs) { }; let vault_name = pascal_case!(vault_name); - if let Err(err) = Vault::setup_vault(current_dir.clone()).await { - eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); - return; - } - - // Read vault cfg - let mut vault_cfg = match VaultConfig::read().await { - Ok(cfg) => cfg, - Err(err) => { - eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); - return; - } - }; - - vault_cfg.change_name(vault_name); - if let Err(err) = VaultConfig::write(&vault_cfg).await { + if let Err(err) = Vault::setup_vault(current_dir.clone(), vault_name).await { eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); return; } @@ -523,34 +512,7 @@ async fn jvv_create(args: CreateVaultArgs) { // Setup vault let vault_name = pascal_case!(args.vault_name); - if let Err(err) = Vault::setup_vault(target_dir.clone()).await { - eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); - return; - } - - // Enter target_dir - if set_current_dir(&target_dir).is_err() { - eprintln!( - "{}", - t!( - "jvv.fail.std.set_current_dir", - dir = target_dir.to_string_lossy() - ) - ); - return; - } - - // Read vault cfg - let mut vault_cfg = match VaultConfig::read().await { - Ok(cfg) => cfg, - Err(err) => { - eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); - return; - } - }; - - vault_cfg.change_name(vault_name); - if let Err(err) = VaultConfig::write(&vault_cfg).await { + if let Err(err) = Vault::setup_vault(target_dir.clone(), vault_name).await { eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); return; } @@ -652,7 +614,24 @@ async fn jvv_service_listen(args: ListenArgs) { return; }; - if !args.no_log { + let Ok(vault_cfg) = VaultConfig::read().await else { + eprintln!("{}", t!("jvv.fail.here.cfg_not_found").trim()); + return; + }; + + let show_logger = if args.no_log && !args.show_log { + false + } else if !args.no_log && args.show_log { + true + } else if !args.no_log && !args.show_log { + // Read profile + vault_cfg.server_config().is_logger_enabled() + } else { + eprintln!("{}", md(t!("jvv.fail.service.wtf_show_log_and_no_log"))); + return; + }; + + if show_logger { let logs_dir = current_vault.join("logs"); if let Err(_) = fs::create_dir_all(&logs_dir).await { eprintln!( @@ -666,7 +645,10 @@ async fn jvv_service_listen(args: ListenArgs) { } let now = chrono::Local::now(); let log_filename = format!("log_{}.txt", now.format("%Y.%m.%d-%H:%M:%S")); - build_env_logger(logs_dir.join(log_filename)); + build_env_logger( + logs_dir.join(log_filename), + vault_cfg.server_config().logger_level(), + ); info!( "{}", t!( diff --git a/src/utils/logger.rs b/src/utils/logger.rs index e1b9e65..5871094 100644 --- a/src/utils/logger.rs +++ b/src/utils/logger.rs @@ -2,10 +2,12 @@ use std::path::Path; use colored::Colorize; use env_logger::{Builder, Target}; -use just_enough_vcs::utils::string_proc::format_path::format_path; +use just_enough_vcs::{ + utils::string_proc::format_path::format_path, vcs::data::vault::config::LoggerLevel, +}; use log::{Level, LevelFilter}; -pub fn build_env_logger(log_path: impl AsRef) { +pub fn build_env_logger(log_path: impl AsRef, logger_level: LoggerLevel) { use std::io::{self, Write}; struct MultiWriter { @@ -70,10 +72,16 @@ pub fn build_env_logger(log_path: impl AsRef) { let log_file = std::fs::File::create(log_path).expect("Failed to create log file"); let combined_target = Target::Pipe(Box::new(MultiWriter::new(std::io::stdout(), log_file))); + let level = match logger_level { + LoggerLevel::Debug => LevelFilter::Debug, + LoggerLevel::Trace => LevelFilter::Trace, + LoggerLevel::Info => LevelFilter::Info, + }; + builder .format(log_format) - .filter(None, LevelFilter::Info) - .filter_module("just_enough_vcs", LevelFilter::Trace) + .filter(None, level.clone()) + .filter_module("just_enough_vcs", level) .target(combined_target) .init(); } -- cgit