rs_logger/
lib.rs

1mod logger;
2
3pub use logger::{appender::*, logger::*, writer::*};
4
5/// Default Logger, will output to stderr
6pub type Logger = BaseLogger<NopAppender>;
7/// Logger that outputs to stdout
8pub type StdoutLogger = BaseLogger<NopAppender, Stdout>;
9/// Logger that outputs to a file
10pub type FileLogger = BaseLogger<NopAppender, LogFileWriter>;
11
12/// log_print! can be used before the logging framework is initialized
13///
14/// ```rust
15/// use log::{debug, LevelFilter, Level};
16/// use rs_logger::{log_print, Logger};
17///
18/// let level = LevelFilter::Info;
19/// // this log will be printed
20/// log_print!(Level::Debug, "going to init logger with level: {}", level);
21/// Logger::init(level);
22/// // this log will not be printed
23/// debug!("current log level: {}", level);
24/// ```
25#[macro_export]
26macro_rules! log_print {
27    ($level:path, $($arg:tt)*) => {
28        $crate::Logger::print($level, module_path!(), &format!($($arg)*));
29    };
30}
31
32#[test]
33fn test_log_appender() {
34    use std::io::Write;
35
36    use log::LevelFilter;
37
38    struct PIDLogAppender;
39
40    impl LogAppender for PIDLogAppender {
41        fn append<W: Write>(stream: &mut W) -> bool {
42            let pid = std::process::id();
43            let _ = write!(stream, "[PID: {pid}]");
44            true
45        }
46    }
47
48    type MyLogger = BaseLogger<PIDLogAppender>;
49    MyLogger::init(LevelFilter::Debug);
50
51    log::error!("test log message");
52}
53
54#[test]
55fn test_log_print_macro() {
56    use log::Level;
57
58    log_print!(Level::Debug, "test log message with log_print!");
59}
60
61#[ignore]
62#[test]
63fn test_log_file_writer() {
64    use std::fs;
65
66    use log::LevelFilter;
67
68    let file = fs::OpenOptions::new().create(true).write(true).truncate(true).open("test_log.txt").unwrap();
69    FileLogger::init(LevelFilter::Info, file);
70    log::error!("test log message to file");
71    assert!(String::from_utf8(fs::read("test_log.txt").unwrap()).unwrap().contains("test log message"));
72    fs::remove_file("test_log.txt").unwrap();
73}