pub mod config;
pub mod filters;
pub mod formatters;
pub mod handlers;
pub mod logger;
pub mod params;
pub mod security;
pub use config::{HandlerConfig, LoggerConfig, LoggingConfig, LoggingManager};
pub use filters::{CallbackFilter, Filter, RequireDebugFalse, RequireDebugTrue};
pub use formatters::{Formatter, ServerFormatter, StandardFormatter, escape_control_chars};
pub use handlers::{ConsoleHandler, FileHandler, JsonHandler, MemoryHandler};
pub use logger::{LogHandler, LogLevel, LogRecord, Logger};
pub use params::{ReprParamsConfig, repr_params, truncate_param};
pub use security::{SecurityError, SecurityLogger};
use once_cell::sync::OnceCell;
use std::sync::Arc;
static GLOBAL_MANAGER: OnceCell<LoggingManager> = OnceCell::new();
#[derive(Clone)]
pub struct LoggerHandle {
inner: Arc<Logger>,
}
impl LoggerHandle {
fn new(logger: Arc<Logger>) -> Self {
Self { inner: logger }
}
pub async fn add_handler<H: LogHandler + 'static>(&self, handler: H) {
self.inner.add_handler(Arc::new(handler)).await;
}
pub async fn set_level(&self, level: LogLevel) {
self.inner.set_level(level).await;
}
pub async fn log_record(&self, record: &LogRecord) {
self.inner.log_record(record).await;
}
pub async fn debug(&self, message: impl Into<String>) {
self.inner.debug(message.into()).await;
}
pub async fn info(&self, message: impl Into<String>) {
self.inner.info(message.into()).await;
}
pub async fn warning(&self, message: impl Into<String>) {
self.inner.warning(message.into()).await;
}
pub fn debug_sync(&self, message: impl Into<String>) {
self.inner.debug_sync(message);
}
pub fn info_sync(&self, message: impl Into<String>) {
self.inner.info_sync(message);
}
pub fn warning_sync(&self, message: impl Into<String>) {
self.inner.warning_sync(message);
}
pub fn error_sync(&self, message: impl Into<String>) {
self.inner.error_sync(message);
}
}
pub fn init_global_logging(config: LoggingConfig) {
let _ = GLOBAL_MANAGER.set(LoggingManager::new(config));
}
fn global_manager() -> &'static LoggingManager {
GLOBAL_MANAGER.get_or_init(|| LoggingManager::new(LoggingConfig))
}
pub fn get_logger(name: &str) -> LoggerHandle {
LoggerHandle::new(global_manager().get_logger(name))
}
pub fn emit_warning(logger_name: &str, message: impl Into<String>) {
let logger = get_logger(logger_name);
logger.warning_sync(message.into());
}
pub async fn attach_memory_handler(logger_name: &str, level: LogLevel) -> handlers::MemoryHandler {
let handler = handlers::MemoryHandler::new(level);
let logger = get_logger(logger_name);
logger.add_handler(handler.clone()).await;
handler
}