pub mod log_writer;
use core::cell::RefCell;
use std::io;
use flexi_logger::{DeferredNow, Record};
use syslog::Severity;
pub use log_writer::{Formatter5424, LogWriter};
pub type LevelToSeverity = fn(level: log::Level) -> Severity;
pub fn default_format(
w: &mut dyn io::Write,
_now: &mut DeferredNow,
record: &Record<'_>,
) -> Result<(), io::Error> {
write!(
w,
"{} {} l:{} {}",
record.level(),
record.target(),
record
.line()
.as_ref()
.map_or_else(|| "-".to_owned(), ToString::to_string),
record.args()
)
}
pub fn default_level_mapping(level: log::Level) -> Severity {
match level {
log::Level::Error => Severity::LOG_ERR,
log::Level::Warn => Severity::LOG_WARNING,
log::Level::Info => Severity::LOG_INFO,
log::Level::Debug | log::Level::Trace => Severity::LOG_DEBUG,
}
}
pub fn exe_name_from_env() -> io::Result<String> {
std::env::current_exe()?
.file_name()
.ok_or_else(|| io::Error::new(io::ErrorKind::Other, "exe path has no filename"))?
.to_str()
.map(String::from)
.ok_or_else(|| io::Error::new(io::ErrorKind::Other, "exe name is not valid UTF8"))
}
pub(crate) fn buffer_with<F>(f: F)
where
F: FnOnce(&RefCell<Vec<u8>>),
{
const DEFAULT_BUFFER_BYTES: usize = 2 * 1024;
thread_local! {
static BUFFER: RefCell<Vec<u8>> = RefCell::new(Vec::with_capacity(DEFAULT_BUFFER_BYTES));
}
BUFFER.with(f);
}