allow enable log with cli, limit log size (#1384)

* impl logger rpc
* use size based appender
* add log args
This commit is contained in:
Sijie.Sun
2025-09-18 16:35:12 +08:00
committed by GitHub
parent 56fd6e4ab6
commit e06e8a9e8a
17 changed files with 1296 additions and 38 deletions
+4
View File
@@ -990,6 +990,7 @@ impl Instance {
return Ok(());
};
use crate::instance::logger_rpc_service::LoggerRpcService;
use crate::proto::cli::*;
let peer_mgr = self.peer_manager.clone();
@@ -999,6 +1000,7 @@ impl Instance {
let mapped_listener_manager_rpc = self.get_mapped_listener_manager_rpc_service();
let port_forward_manager_rpc = self.get_port_forward_manager_rpc_service();
let stats_rpc_service = self.get_stats_rpc_service();
let logger_rpc_service = LoggerRpcService::new();
let s = self.rpc_server.as_mut().unwrap();
let peer_mgr_rpc_service = PeerManagerRpcService::new(peer_mgr.clone());
@@ -1027,6 +1029,8 @@ impl Instance {
crate::proto::cli::StatsRpcServer::new(stats_rpc_service),
"",
);
s.registry()
.register(LoggerRpcServer::new(logger_rpc_service), "");
if let Some(ip_proxy) = self.ip_proxy.as_ref() {
s.registry().register(
+109
View File
@@ -0,0 +1,109 @@
use std::sync::{mpsc::Sender, Mutex, OnceLock};
use crate::proto::{
cli::{
GetLoggerConfigRequest, GetLoggerConfigResponse, LogLevel, LoggerRpc,
SetLoggerConfigRequest, SetLoggerConfigResponse,
},
rpc_types::{self, controller::BaseController},
};
pub static LOGGER_LEVEL_SENDER: std::sync::OnceLock<Mutex<Sender<String>>> = OnceLock::new();
pub static CURRENT_LOG_LEVEL: std::sync::OnceLock<Mutex<String>> = OnceLock::new();
#[derive(Clone)]
pub struct LoggerRpcService;
impl LoggerRpcService {
pub fn new() -> Self {
Self
}
fn log_level_to_string(level: LogLevel) -> String {
match level {
LogLevel::Disabled => "off".to_string(),
LogLevel::Error => "error".to_string(),
LogLevel::Warning => "warn".to_string(),
LogLevel::Info => "info".to_string(),
LogLevel::Debug => "debug".to_string(),
LogLevel::Trace => "trace".to_string(),
}
}
fn string_to_log_level(level_str: &str) -> LogLevel {
match level_str.to_lowercase().as_str() {
"off" | "disabled" => LogLevel::Disabled,
"error" => LogLevel::Error,
"warn" | "warning" => LogLevel::Warning,
"info" => LogLevel::Info,
"debug" => LogLevel::Debug,
"trace" => LogLevel::Trace,
_ => LogLevel::Info, // 默认为 Info 级别
}
}
}
#[async_trait::async_trait]
impl LoggerRpc for LoggerRpcService {
type Controller = BaseController;
async fn set_logger_config(
&self,
_: BaseController,
request: SetLoggerConfigRequest,
) -> Result<SetLoggerConfigResponse, rpc_types::error::Error> {
let level_str = Self::log_level_to_string(request.level());
// 更新当前日志级别
if let Some(current_level) = CURRENT_LOG_LEVEL.get() {
if let Ok(mut level) = current_level.lock() {
*level = level_str.clone();
}
}
// 发送新的日志级别到 logger 重载器
if let Some(sender) = LOGGER_LEVEL_SENDER.get() {
if let Ok(sender) = sender.lock() {
if let Err(e) = sender.send(level_str) {
tracing::warn!("Failed to send new log level to reloader: {}", e);
return Err(rpc_types::error::Error::ExecutionError(anyhow::anyhow!(
"Failed to update log level: {}",
e
)));
}
} else {
return Err(rpc_types::error::Error::ExecutionError(anyhow::anyhow!(
"Logger sender is not available"
)));
}
} else {
return Err(rpc_types::error::Error::ExecutionError(anyhow::anyhow!(
"Logger reloader is not initialized"
)));
}
Ok(SetLoggerConfigResponse {})
}
async fn get_logger_config(
&self,
_: BaseController,
_request: GetLoggerConfigRequest,
) -> Result<GetLoggerConfigResponse, rpc_types::error::Error> {
let current_level_str = if let Some(current_level) = CURRENT_LOG_LEVEL.get() {
if let Ok(level) = current_level.lock() {
level.clone()
} else {
"info".to_string() // 默认级别
}
} else {
"info".to_string() // 默认级别
};
let level = Self::string_to_log_level(&current_level_str);
Ok(GetLoggerConfigResponse {
level: level.into(),
})
}
}
+2
View File
@@ -6,3 +6,5 @@ pub mod listeners;
#[cfg(feature = "tun")]
pub mod virtual_nic;
pub mod logger_rpc_service;