From 70d02910b71b94803c8c53a1f42c5778d569aecb Mon Sep 17 00:00:00 2001 From: Alexey <247128645+axkurcom@users.noreply.github.com> Date: Wed, 20 May 2026 10:54:37 +0300 Subject: [PATCH] Fixes for SILENT-mode by #792 Signed-off-by: Alexey <247128645+axkurcom@users.noreply.github.com> --- src/config/types.rs | 3 +-- src/maestro/helpers.rs | 36 ++++++++++++++++++------------------ src/maestro/mod.rs | 12 +++++++----- src/maestro/runtime_tasks.rs | 21 +++++++++++++-------- 4 files changed, 39 insertions(+), 33 deletions(-) diff --git a/src/config/types.rs b/src/config/types.rs index e118cf4..f1cc816 100644 --- a/src/config/types.rs +++ b/src/config/types.rs @@ -21,8 +21,7 @@ pub enum LogLevel { #[default] Normal, /// Minimal output: only warnings and errors (warn + error). - /// Startup messages (config, DC connectivity, proxy links) are always shown - /// via info! before the filter is applied. + /// Proxy links may still be emitted through their dedicated target. Silent, } diff --git a/src/maestro/helpers.rs b/src/maestro/helpers.rs index 89f4f59..1c9b337 100644 --- a/src/maestro/helpers.rs +++ b/src/maestro/helpers.rs @@ -15,6 +15,13 @@ use crate::transport::middle_proxy::{ save_proxy_config_cache, }; +const MAESTRO_COLOR: &str = "\x1b[92m"; +const COLOR_RESET: &str = "\x1b[0m"; + +pub(crate) fn print_maestro_line(message: impl AsRef) { + eprintln!("{MAESTRO_COLOR}MAESTRO{COLOR_RESET}: {}", message.as_ref()); +} + pub(crate) fn resolve_runtime_config_path( config_path_cli: &str, startup_cwd: &Path, @@ -501,7 +508,7 @@ mod tests { } pub(crate) fn print_proxy_links(host: &str, port: u16, config: &ProxyConfig) { - info!(target: "telemt::links", "--- Proxy Links ({}) ---", host); + print_maestro_line(format!("Proxy links ({host})")); for user_name in config .general .links @@ -509,20 +516,16 @@ pub(crate) fn print_proxy_links(host: &str, port: u16, config: &ProxyConfig) { .resolve_users(&config.access.users) { if let Some(secret) = config.access.users.get(user_name) { - info!(target: "telemt::links", "User: {}", user_name); + print_maestro_line(format!("User: {user_name}")); if config.general.modes.classic { - info!( - target: "telemt::links", - " Classic: tg://proxy?server={}&port={}&secret={}", - host, port, secret - ); + print_maestro_line(format!( + "Classic: tg://proxy?server={host}&port={port}&secret={secret}" + )); } if config.general.modes.secure { - info!( - target: "telemt::links", - " DD: tg://proxy?server={}&port={}&secret=dd{}", - host, port, secret - ); + print_maestro_line(format!( + "DD: tg://proxy?server={host}&port={port}&secret=dd{secret}" + )); } if config.general.modes.tls { let mut domains = Vec::with_capacity(1 + config.censorship.tls_domains.len()); @@ -535,18 +538,15 @@ pub(crate) fn print_proxy_links(host: &str, port: u16, config: &ProxyConfig) { for domain in domains { let domain_hex = hex::encode(&domain); - info!( - target: "telemt::links", - " EE-TLS: tg://proxy?server={}&port={}&secret=ee{}{}", - host, port, secret, domain_hex - ); + print_maestro_line(format!( + "EE-TLS: tg://proxy?server={host}&port={port}&secret=ee{secret}{domain_hex}" + )); } } } else { warn!(target: "telemt::links", "User '{}' in show_link not found", user_name); } } - info!(target: "telemt::links", "------------------------"); } pub(crate) async fn write_beobachten_snapshot(path: &str, payload: &str) -> std::io::Result<()> { diff --git a/src/maestro/mod.rs b/src/maestro/mod.rs index 3a957e5..0f3c14e 100644 --- a/src/maestro/mod.rs +++ b/src/maestro/mod.rs @@ -47,7 +47,7 @@ use crate::stats::{ReplayChecker, Stats}; use crate::stream::BufferPool; use crate::transport::UpstreamManager; use crate::transport::middle_proxy::MePool; -use helpers::{parse_cli, resolve_runtime_base_dir, resolve_runtime_config_path}; +use helpers::{parse_cli, print_maestro_line, resolve_runtime_base_dir, resolve_runtime_config_path}; #[cfg(unix)] use crate::daemon::{DaemonOptions, PidFile, drop_privileges}; @@ -325,7 +325,9 @@ async fn run_telemt_core( config.general.log_level.clone() }; - let (filter_layer, filter_handle) = reload::Layer::new(EnvFilter::new("info")); + let initial_filter_spec = runtime_tasks::log_filter_spec(has_rust_log, &effective_log_level); + let (filter_layer, filter_handle) = + reload::Layer::new(EnvFilter::new(initial_filter_spec.clone())); startup_tracker .start_component( COMPONENT_TRACING_INIT, @@ -356,7 +358,7 @@ async fn run_telemt_core( destination: log_destination, disable_colors: true, }; - let (_, guard) = crate::logging::init_logging(&logging_opts, "info"); + let (_, guard) = crate::logging::init_logging(&logging_opts, &initial_filter_spec); _logging_guard = Some(guard); } crate::logging::LogDestination::File { .. } => { @@ -365,7 +367,7 @@ async fn run_telemt_core( destination: log_destination, disable_colors: true, }; - let (_, guard) = crate::logging::init_logging(&logging_opts, "info"); + let (_, guard) = crate::logging::init_logging(&logging_opts, &initial_filter_spec); _logging_guard = Some(guard); } } @@ -377,7 +379,7 @@ async fn run_telemt_core( ) .await; - info!("Telemt MTProxy v{}", env!("CARGO_PKG_VERSION")); + print_maestro_line(format!("Telemt MTProxy v{}", env!("CARGO_PKG_VERSION"))); info!("Log level: {}", effective_log_level); if config.general.disable_colors { info!("Colors: disabled"); diff --git a/src/maestro/runtime_tasks.rs b/src/maestro/runtime_tasks.rs index 930acda..8b9a9aa 100644 --- a/src/maestro/runtime_tasks.rs +++ b/src/maestro/runtime_tasks.rs @@ -319,13 +319,7 @@ pub(crate) async fn apply_runtime_log_filter( filter_handle: reload::Handle, mut log_level_rx: watch::Receiver, ) { - let runtime_filter = if has_rust_log { - EnvFilter::from_default_env() - } else if matches!(effective_log_level, LogLevel::Silent) { - EnvFilter::new("warn,telemt::links=info") - } else { - EnvFilter::new(effective_log_level.to_filter_str()) - }; + let runtime_filter = EnvFilter::new(log_filter_spec(has_rust_log, effective_log_level)); filter_handle .reload(runtime_filter) .expect("Failed to switch log filter"); @@ -336,7 +330,7 @@ pub(crate) async fn apply_runtime_log_filter( break; } let level = log_level_rx.borrow_and_update().clone(); - let new_filter = tracing_subscriber::EnvFilter::new(level.to_filter_str()); + let new_filter = tracing_subscriber::EnvFilter::new(log_filter_spec(false, &level)); if let Err(e) = filter_handle.reload(new_filter) { tracing::error!("config reload: failed to update log filter: {}", e); } @@ -344,6 +338,17 @@ pub(crate) async fn apply_runtime_log_filter( }); } +pub(crate) fn log_filter_spec(has_rust_log: bool, effective_log_level: &LogLevel) -> String { + if has_rust_log { + std::env::var("RUST_LOG") + .unwrap_or_else(|_| effective_log_level.to_filter_str().to_string()) + } else if matches!(effective_log_level, LogLevel::Silent) { + "warn,telemt::links=info".to_string() + } else { + effective_log_level.to_filter_str().to_string() + } +} + pub(crate) async fn spawn_metrics_if_configured( config: &Arc, startup_tracker: &Arc,