mod logger;
mod msg;
mod setting;
mod time;
pub use logger::*;
pub use setting::Setting;
#[cfg(feature = "async")]
pub use async_log::*;
#[cfg(not(feature = "async"))]
pub use log::*;
use lazy_static::lazy_static;
#[cfg(not(feature = "async"))]
use std::sync::Mutex;
#[cfg(feature = "async")]
use tokio;
#[cfg(feature = "async")]
use tokio::sync::Mutex;
lazy_static! {
pub static ref LOGGER: Mutex<Logger> = Mutex::new(Logger::new());
}
#[macro_export]
macro_rules! func {
() => {{
fn f() {}
fn type_name_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
let name = type_name_of(f);
name.strip_suffix("::f")
.unwrap()
.rsplit("::")
.find(|&part| part != "{{closure}}")
.expect("Short function name")
}};
}
#[macro_export]
macro_rules! position {
() => {{
let function = $crate::func!();
let file = file!();
let line = line!();
format!("{} @ {}:{}", function, file, line)
}};
}
#[cfg(feature = "async")]
mod async_log {
use super::*;
pub async fn init(setting: Setting) {
let mut logger = LOGGER.lock().await;
logger.init(setting).await;
}
pub async fn clean_log() {
let mut writer = LOGGER.lock().await;
writer.clear_dir().await;
}
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().await.error(format!($($arg)*).as_str(), position).await;
};
}
#[macro_export]
macro_rules! warn {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().await.warn(format!($($arg)*).as_str(), position).await;
};
}
#[macro_export]
macro_rules! info {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().await.info(format!($($arg)*).as_str(), position).await;
};
}
#[macro_export]
macro_rules! debug {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().await.debug(format!($($arg)*).as_str(), position).await;
};
}
#[macro_export]
macro_rules! trace {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().await.trace(format!($($arg)*).as_str(), position).await;
};
}
#[macro_export]
macro_rules! log {
($level:expr, $($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().await.record($level, &format!($($arg)*), position).await;
}
}
pub async fn enable_log() {
let mut writer = LOGGER.lock().await;
writer.enable();
}
pub async fn disable_log() {
let mut writer = LOGGER.lock().await;
writer.disable();
}
}
#[cfg(not(feature = "async"))]
mod log {
use super::*;
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().expect("Cannot lock the logger.").error(&format!($($arg)*), position);
};
}
#[macro_export]
macro_rules! warn {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().expect("Cannot lock the logger.").warn(&format!($($arg)*), position);
};
}
#[macro_export]
macro_rules! info {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().expect("Cannot lock the logger.").info(&format!($($arg)*), position);
};
}
#[macro_export]
macro_rules! debug {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().expect("Cannot lock the logger.").debug(&format!($($arg)*), position);
};
}
#[macro_export]
macro_rules! trace {
($($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().expect("Cannot lock the logger.").trace(&format!($($arg)*), position);
};
}
#[macro_export]
macro_rules! log {
($level:expr, $($arg:tt)*) => {
let position = $crate::position!().to_string();
$crate::LOGGER.lock().expect("Cannot lock the logger.").record($level, &format!($($arg)*), position);
}
}
pub fn init(setting: Setting) {
let mut logger = LOGGER.lock().unwrap();
logger.init(setting);
}
pub fn clean_log() {
let mut writer = LOGGER.lock().expect("Cannot lock the logger.");
writer.clear_dir();
}
pub fn enable_log() {
let mut writer = LOGGER.lock().expect("Cannot lock the logger.");
writer.enable();
}
pub fn disable_log() {
let mut writer = LOGGER.lock().expect("Cannot lock the logger.");
writer.disable();
}
}
#[derive(Copy, Clone, Debug)]
pub enum LogLevel {
Trace = 0,
Debug = 1,
Info = 2,
Warn = 3,
Error = 4,
}
impl std::fmt::Display for LogLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LogLevel::Info => write!(f, "INFO "),
LogLevel::Debug => write!(f, "DEBUG"),
LogLevel::Warn => write!(f, "WARN "),
LogLevel::Error => write!(f, "ERROR"),
LogLevel::Trace => write!(f, "TRACE"),
}
}
}
impl LogLevel {
pub fn get_level(&self) -> usize {
*self as usize
}
}
unsafe impl Send for LogLevel {}