use crate::Logger;
use crate::enums::log_level::LogLevel;
use std::env;
use std::io;
pub(crate) fn parse_log_level_from_env() -> LogLevel {
if let Ok(rust_log) = env::var("RUST_LOG") {
if let Ok(level) = rust_log.parse::<LogLevel>() {
return level;
}
}
if let Ok(log_level) = env::var("LOG_LEVEL") {
if let Ok(level) = log_level.parse::<LogLevel>() {
return level;
}
}
LogLevel::Info
}
pub fn logger_from_env() -> Logger {
let level = parse_log_level_from_env();
Logger::with_level(level)
}
pub fn stdout_logger_from_env() -> Logger {
logger_from_env().stdout()
}
pub fn stderr_logger_from_env() -> Logger {
logger_from_env().stderr()
}
pub fn file_logger_from_env(path: &str) -> io::Result<Logger> {
logger_from_env().file(path)
}
pub fn stdout_logger() -> Logger {
Logger::new().stdout()
}
pub fn stderr_logger() -> Logger {
Logger::new().stderr()
}
pub fn file_logger(path: &str) -> io::Result<Logger> {
Logger::new().file(path)
}
pub fn console_loggers() -> Vec<Logger> {
vec![Logger::new().stdout(), Logger::new().stderr()]
}
pub fn custom_time_logger(time_format: &str) -> Logger {
Logger::new().time_format(time_format).stdout()
}
pub fn log_to_multiple(loggers: &[Logger], level: LogLevel, message: &str) -> io::Result<()> {
for logger in loggers {
logger.log_with_level(level, message)?;
}
Ok(())
}
pub fn log_str_to_multiple(loggers: &[Logger], level: LogLevel, message: &str) -> io::Result<()> {
for logger in loggers {
logger.log_with_level(level, message)?;
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use std::env;
#[test]
fn test_parse_log_level_from_env() {
unsafe {
env::remove_var("RUST_LOG");
env::remove_var("LOG_LEVEL");
}
unsafe {
env::set_var("RUST_LOG", "debug");
}
assert_eq!(parse_log_level_from_env(), LogLevel::Debug);
unsafe {
env::set_var("RUST_LOG", "error");
}
assert_eq!(parse_log_level_from_env(), LogLevel::Error);
unsafe {
env::set_var("RUST_LOG", "trace");
}
assert_eq!(parse_log_level_from_env(), LogLevel::Trace);
unsafe {
env::remove_var("RUST_LOG");
env::remove_var("LOG_LEVEL");
env::set_var("LOG_LEVEL", "warning");
}
assert_eq!(parse_log_level_from_env(), LogLevel::Warning);
unsafe {
env::remove_var("LOG_LEVEL");
env::set_var("RUST_LOG", "DEBUG");
}
assert_eq!(parse_log_level_from_env(), LogLevel::Debug);
unsafe {
env::set_var("RUST_LOG", "WARN");
}
assert_eq!(parse_log_level_from_env(), LogLevel::Warning);
unsafe {
env::remove_var("LOG_LEVEL");
env::set_var("RUST_LOG", "invalid");
}
assert_eq!(parse_log_level_from_env(), LogLevel::Info);
unsafe {
env::remove_var("RUST_LOG");
env::remove_var("LOG_LEVEL");
}
assert_eq!(parse_log_level_from_env(), LogLevel::Info);
unsafe {
env::remove_var("RUST_LOG");
env::remove_var("LOG_LEVEL");
}
unsafe {
env::remove_var("RUST_LOG");
}
unsafe {
env::remove_var("RUST_LOG");
env::set_var("RUST_LOG", "debug");
}
unsafe {
env::remove_var("RUST_LOG");
env::set_var("RUST_LOG", " myapp = debug , hyper = info ");
}
unsafe {
env::remove_var("RUST_LOG");
}
unsafe {
env::remove_var("RUST_LOG");
env::remove_var("LOG_LEVEL");
}
unsafe {
env::set_var("RUST_LOG", "debug");
}
let logger = logger_from_env();
assert_eq!(logger.get_level(), LogLevel::Debug);
unsafe {
env::remove_var("RUST_LOG");
env::set_var("LOG_LEVEL", "error");
}
let logger = logger_from_env();
assert_eq!(logger.get_level(), LogLevel::Error);
unsafe {
env::remove_var("RUST_LOG");
env::remove_var("LOG_LEVEL");
}
}
#[test]
fn test_stdout_logger() -> io::Result<()> {
let logger = stdout_logger();
assert_eq!(logger.level(), LogLevel::Info);
logger.info("Test message")?;
Ok(())
}
#[test]
fn test_console_loggers() -> io::Result<()> {
let loggers = console_loggers();
assert_eq!(loggers.len(), 2);
log_str_to_multiple(&loggers, LogLevel::Info, "Console message")?;
for logger in &loggers {
assert_eq!(logger.level(), LogLevel::Info);
}
Ok(())
}
#[test]
fn test_log_to_multiple() -> io::Result<()> {
let loggers = vec![
Logger::new().no_time_prefix(),
Logger::new().no_time_prefix(),
];
log_str_to_multiple(&loggers, LogLevel::Info, "Multi-target message")?;
for logger in &loggers {
assert_eq!(logger.level(), LogLevel::Info);
}
Ok(())
}
}