mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-15 10:25:40 +00:00
allow enable log with cli, limit log size (#1384)
* impl logger rpc * use size based appender * add log args
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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(¤t_level_str);
|
||||
|
||||
Ok(GetLoggerConfigResponse {
|
||||
level: level.into(),
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -6,3 +6,5 @@ pub mod listeners;
|
||||
|
||||
#[cfg(feature = "tun")]
|
||||
pub mod virtual_nic;
|
||||
|
||||
pub mod logger_rpc_service;
|
||||
|
||||
Reference in New Issue
Block a user