refactor for tracing and api logging
This commit is contained in:
		| @@ -1,104 +0,0 @@ | ||||
| use parking_lot::Mutex; | ||||
| use std::sync::Arc; | ||||
|  | ||||
| // Must use async_std channel to send to main thread from blocking thread | ||||
| use async_std::channel::bounded as async_bounded; | ||||
| use async_std::channel::Receiver as AsyncReceiver; | ||||
| pub use async_std::channel::RecvError; | ||||
|  | ||||
| // Must use std mpsc so no logs are generated by async code | ||||
| use std::sync::mpsc::sync_channel as std_sync_channel; | ||||
| use std::sync::mpsc::SyncSender as StdSender; | ||||
| use std::sync::mpsc::TrySendError as StdTrySendError; | ||||
|  | ||||
| ////////////////////////////////////////// | ||||
| #[derive(Clone)] | ||||
| pub struct LogSafeChannelCloser { | ||||
|     sender: Arc<Mutex<Option<StdSender<String>>>>, | ||||
| } | ||||
|  | ||||
| impl LogSafeChannelCloser { | ||||
|     pub fn close(&self) { | ||||
|         // Drop the sender | ||||
|         self.sender.lock().take(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////// | ||||
| pub struct LogSafeChannelWriterShim { | ||||
|     sender: Arc<Mutex<Option<StdSender<String>>>>, | ||||
| } | ||||
|  | ||||
| impl std::io::Write for LogSafeChannelWriterShim { | ||||
|     fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> { | ||||
|         let bufstr = String::from_utf8_lossy(buf).to_string(); | ||||
|         let sender = self.sender.lock(); | ||||
|         if let Some(sender) = &*sender { | ||||
|             if let Err(e) = sender.try_send(bufstr) { | ||||
|                 match e { | ||||
|                     StdTrySendError::Full(_) => { | ||||
|                         Err(std::io::Error::from(std::io::ErrorKind::WouldBlock)) | ||||
|                     } | ||||
|                     StdTrySendError::Disconnected(_) => { | ||||
|                         Err(std::io::Error::from(std::io::ErrorKind::BrokenPipe)) | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 Ok(buf.len()) | ||||
|             } | ||||
|         } else { | ||||
|             Err(std::io::Error::from(std::io::ErrorKind::BrokenPipe)) | ||||
|         } | ||||
|     } | ||||
|     fn flush(&mut self) -> std::io::Result<()> { | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub type LogSafeChannelWriter = std::io::LineWriter<LogSafeChannelWriterShim>; | ||||
|  | ||||
| ////////////////////////////////////////// | ||||
|  | ||||
| #[derive(Clone)] | ||||
| pub struct LogSafeChannel { | ||||
|     async_receiver: AsyncReceiver<String>, | ||||
| } | ||||
|  | ||||
| impl LogSafeChannel { | ||||
|     pub fn new() -> (Self, LogSafeChannelWriter, LogSafeChannelCloser) { | ||||
|         let (async_sender, async_receiver) = async_bounded(1024); | ||||
|         let (std_sender, std_receiver) = std_sync_channel(1024); | ||||
|         let shared_std_sender = Arc::new(Mutex::new(Some(std_sender))); | ||||
|  | ||||
|         // Spawn a processing thread for the blocking std sender | ||||
|         async_std::task::spawn(async move { | ||||
|             #[allow(clippy::while_let_loop)] | ||||
|             loop { | ||||
|                 let message = match std_receiver.recv() { | ||||
|                     Ok(v) => v, | ||||
|                     Err(_) => break, | ||||
|                 }; | ||||
|                 if async_sender.send(message).await.is_err() { | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         ( | ||||
|             Self { async_receiver }, | ||||
|             LogSafeChannelWriter::with_capacity( | ||||
|                 65536, | ||||
|                 LogSafeChannelWriterShim { | ||||
|                     sender: shared_std_sender.clone(), | ||||
|                 }, | ||||
|             ), | ||||
|             LogSafeChannelCloser { | ||||
|                 sender: shared_std_sender, | ||||
|             }, | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     pub async fn recv(&mut self) -> Result<String, RecvError> { | ||||
|         self.async_receiver.recv().await | ||||
|     } | ||||
| } | ||||
| @@ -4,7 +4,6 @@ | ||||
|  | ||||
| mod client_api; | ||||
| mod cmdline; | ||||
| mod log_safe_channel; | ||||
| mod server; | ||||
| mod settings; | ||||
| #[cfg(unix)] | ||||
| @@ -58,9 +57,9 @@ fn main() -> Result<(), String> { | ||||
|     // Handle non-normal server modes | ||||
|     if !matches!(server_mode, ServerMode::Normal) { | ||||
|         // Init combined console/file logger | ||||
|         let logs = VeilidLogs::setup(settings.clone())?; | ||||
|         let _logs = VeilidLogs::setup(settings.clone())?; | ||||
|         // run the server to set the node id and quit | ||||
|         return task::block_on(async { run_veilid_server(settings, logs, server_mode).await }) | ||||
|         return task::block_on(async { run_veilid_server(settings, server_mode).await }) | ||||
|             .map(|v| { | ||||
|                 println!("{}", success); | ||||
|                 v | ||||
| @@ -83,7 +82,7 @@ fn main() -> Result<(), String> { | ||||
|     } | ||||
|  | ||||
|     // Init combined console/file logger | ||||
|     let logs = VeilidLogs::setup(settings.clone())?; | ||||
|     let _logs = VeilidLogs::setup(settings.clone())?; | ||||
|  | ||||
|     // --- Normal Startup --- | ||||
|     ctrlc::set_handler(move || { | ||||
| @@ -92,5 +91,5 @@ fn main() -> Result<(), String> { | ||||
|     .expect("Error setting Ctrl-C handler"); | ||||
|  | ||||
|     // Run the server loop | ||||
|     task::block_on(async { run_veilid_server(settings, logs, server_mode).await }) | ||||
|     task::block_on(async { run_veilid_server(settings, server_mode).await }) | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| use crate::client_api; | ||||
| use crate::settings::*; | ||||
| use crate::veilid_logs::*; | ||||
| use flume::{bounded, Receiver, Sender}; | ||||
| use lazy_static::*; | ||||
| use parking_lot::Mutex; | ||||
| @@ -28,12 +27,8 @@ pub fn shutdown() { | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub async fn run_veilid_server( | ||||
|     settings: Settings, | ||||
|     logs: VeilidLogs, | ||||
|     server_mode: ServerMode, | ||||
| ) -> Result<(), String> { | ||||
|     run_veilid_server_internal(settings, logs, server_mode) | ||||
| pub async fn run_veilid_server(settings: Settings, server_mode: ServerMode) -> Result<(), String> { | ||||
|     run_veilid_server_internal(settings, server_mode) | ||||
|         .await | ||||
|         .map_err(|e| { | ||||
|             error!("{}", e); | ||||
| @@ -42,7 +37,6 @@ pub async fn run_veilid_server( | ||||
| } | ||||
| pub async fn run_veilid_server_internal( | ||||
|     settings: Settings, | ||||
|     logs: VeilidLogs, | ||||
|     server_mode: ServerMode, | ||||
| ) -> Result<(), String> { | ||||
|     let settingsr = settings.read(); | ||||
|   | ||||
| @@ -93,7 +93,7 @@ pub fn run_daemon(settings: Settings, _matches: ArgMatches) -> Result<(), String | ||||
|     }; | ||||
|  | ||||
|     // Init combined console/file logger | ||||
|     let logs = VeilidLogs::setup(settings.clone())?; | ||||
|     let _logs = VeilidLogs::setup(settings.clone())?; | ||||
|  | ||||
|     // Daemonize | ||||
|     daemon | ||||
| @@ -109,7 +109,7 @@ pub fn run_daemon(settings: Settings, _matches: ArgMatches) -> Result<(), String | ||||
|  | ||||
|         let signals_task = async_std::task::spawn(handle_signals(signals)); | ||||
|  | ||||
|         let res = run_veilid_server(settings, logs, ServerMode::Normal).await; | ||||
|         let res = run_veilid_server(settings, ServerMode::Normal).await; | ||||
|  | ||||
|         // Terminate the signal stream. | ||||
|         handle.close(); | ||||
|   | ||||
| @@ -15,6 +15,12 @@ fn logfilter<T: AsRef<str>, V: AsRef<[T]>>( | ||||
|     max_level: veilid_core::VeilidLogLevel, | ||||
|     ignore_list: V, | ||||
| ) -> bool { | ||||
|     // Skip things out of level | ||||
|     let log_level = veilid_core::VeilidLogLevel::from_tracing_level(*metadata.level()); | ||||
|     if log_level <= max_level { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     // Skip filtered targets | ||||
|     !match (metadata.target(), ignore_list.as_ref()) { | ||||
|         (path, ignore) if !ignore.is_empty() => { | ||||
| @@ -46,6 +52,7 @@ impl VeilidLogs { | ||||
|  | ||||
|         let subscriber = subscriber.with(if settingsr.logging.terminal.enabled { | ||||
|             let terminal_max_log_level = convert_loglevel(settingsr.logging.terminal.level); | ||||
|             let ignore_list = ignore_list.clone(); | ||||
|             Some( | ||||
|                 fmt::Layer::new() | ||||
|                     .compact() | ||||
| @@ -86,11 +93,12 @@ impl VeilidLogs { | ||||
|                 tracing_appender::non_blocking(appender); | ||||
|             guard = Some(non_blocking_guard); | ||||
|  | ||||
|             let ignore_list = ignore_list.clone(); | ||||
|             Some( | ||||
|                 fmt::Layer::new() | ||||
|                     .compact() | ||||
|                     .with_writer(non_blocking_appender) | ||||
|                     .with_filter(filter::FilterFn::new(|metadata| { | ||||
|                     .with_filter(filter::FilterFn::new(move |metadata| { | ||||
|                         logfilter(metadata, file_max_log_level, &ignore_list) | ||||
|                     })), | ||||
|             ) | ||||
| @@ -108,8 +116,9 @@ impl VeilidLogs { | ||||
|         cfg_if! { | ||||
|             if #[cfg(target_os = "linux")] { | ||||
|                 let subscriber = subscriber.with(if settingsr.logging.system.enabled { | ||||
|                     let ignore_list = ignore_list.clone(); | ||||
|                     let system_max_log_level = convert_loglevel(settingsr.logging.system.level); | ||||
|                     Some(tracing_journald::layer().map_err(|e| format!("failed to set up journald logging: {}", e))?.with_filter(filter::FilterFn::new(|metadata| { | ||||
|                     Some(tracing_journald::layer().map_err(|e| format!("failed to set up journald logging: {}", e))?.with_filter(filter::FilterFn::new(move |metadata| { | ||||
|                         logfilter(metadata, system_max_log_level, &ignore_list) | ||||
|                     }))) | ||||
|                 } else { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user