1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//! A logging library which prints a minimal, colored and beautiful output.

#[cfg(feature = "colored")]
extern crate colored;
#[cfg(feature = "colored")]
use colored::*;

use log::{Level, Log, Metadata, Record, SetLoggerError};

struct BeautifulLogger {
    level: Level,
}

impl Log for BeautifulLogger {
    fn enabled(&self, metadata: &Metadata) -> bool {
        metadata.level() <= self.level
    }

    fn log(&self, record: &Record) {
        let prefix = match record.level() {
            Level::Error => "error",
            Level::Debug => "debug",
            Level::Trace => "trace",
            Level::Warn => "warn",
            Level::Info => "info",
        };

        #[cfg(feature = "colored")]
        let prefix = (match record.level() {
            Level::Error => prefix.red(),
            Level::Debug => prefix.cyan(),
            Level::Trace => prefix.purple(),
            Level::Warn => prefix.yellow(),
            Level::Info => prefix.white(),
        })
        .bold();

        let message = format!("{}: {}", prefix, record.args());
        #[cfg(feature = "colored")]
        let message = message.bold();
        println!("{}", message);
    }

    fn flush(&self) {}
}

/// Tries to initialize the logger with the given level.
///
/// # Example
/// ```
/// # #[macro_use]
/// # extern crate log;
/// # extern crate belog;
/// # fn main() {
/// belog::try_init_with_level(log::Level::Debug).expect("Failed to initialize logger.");
///
/// info!("Some info here");
/// trace!("Some trace message here");
/// # }
/// ```
pub fn try_init_with_level(level: Level) -> Result<(), SetLoggerError> {
    let logger = BeautifulLogger { level };
    log::set_max_level(level.to_level_filter());
    log::set_boxed_logger(Box::new(logger))?;
    Ok(())
}

/// Initializes the logger with the given level,
/// but panics if it fails to set the logger.
///
/// # Example
/// ```
/// # #[macro_use]
/// # extern crate log;
/// # extern crate belog;
/// # fn main() {
/// belog::init_with_level(log::Level::Info);
///
/// info!("Some info here");
/// debug!("Some debug message here");
/// # }
/// ```
pub fn init_with_level(level: Level) {
    try_init_with_level(level).expect("Failed to set the logger.");
}

/// Tries to initialize the logger with the default level, which is set to Info.
///
/// # Example
/// ```
/// # #[macro_use]
/// # extern crate log;
/// # extern crate belog;
/// # fn main() {
/// belog::try_init().expect("Failed to initialize logger.");
///
/// info!("Some info here");
/// error!("An error occurred");
/// # }
/// ```
pub fn try_init() -> Result<(), SetLoggerError> {
    try_init_with_level(Level::Info)
}

/// Initializes the logger with the default level, which is set to Info,
/// but panics if it fails.
///
/// # Example
/// ```
/// # #[macro_use]
/// # extern crate log;
/// # extern crate belog;
/// # fn main() {
/// belog::init();
///
/// info!("Some info here");
/// error!("An error occurred");
/// # }
/// ```
pub fn init() {
    try_init().expect("Failed to set the logger.");
}