file/
file.rs

1use std::fs::File;
2use std::io::Write;
3use std::path::Path;
4use std::sync::{Arc, Mutex};
5use prologue_logger::{Entry, Task};
6
7struct FileLogger {
8    level: log::LevelFilter,
9    file: Arc<Mutex<File>>
10}
11impl log::Log for FileLogger {
12    fn enabled(&self, metadata: &log::Metadata) -> bool {
13        metadata.level() <= self.level
14    }
15
16    fn log(&self, record: &log::Record) {
17        if self.enabled(record.metadata()) {
18            let mut file = self.file.lock().unwrap();
19            let contents = format!("{}", record.args());
20            file.write(contents.as_bytes()).unwrap();
21        }
22    }
23
24    fn flush(&self) {
25        self.file.lock().unwrap().flush().unwrap()
26    }
27}
28impl FileLogger {
29    pub fn new<P: AsRef<Path>>(filename: P) -> std::io::Result<FileLogger> {
30        let level = log::LevelFilter::Debug;
31        let file = File::create(filename)?;
32        let file = Arc::new(Mutex::new(file));
33        Ok(FileLogger { level, file })
34    }
35
36    pub fn register(self) -> Result<(), log::SetLoggerError> {
37        log::set_max_level(self.level);
38        log::set_boxed_logger(Box::new(self))
39    }
40}
41
42fn main() -> prologue_logger::error::Result<()> {
43    FileLogger::new("file.log")
44        .unwrap()
45        .register()
46        .unwrap();
47
48    Entry::new_warning("starting `file.rs` -- the following is NOT generated by `cargo`")
49        .log("file");
50    Task::new("Running", "example `file.rs`")
51        .log("file");
52    Entry::new_warning("this is a warning line")
53        .named_source("examples/file.rs", 8, 36)
54        .new_line(8, "    let entry = Entry::new_warning(\"this is a warning line\")")
55        .annotate_help(9, 5, "this is the variable")?
56        .annotate_help(17, 18, "this is the invoking function")?
57        .annotate_note(36, 24, "this is the text")?
58        .new_line(9, "    .bright()")
59        .new_line(10, "    .source(source)")
60        .new_line(11, "    .forward_to_stderr();")
61        .annotate_warn(6, 17, "this function does not increase the warning count")?
62        .note("this is not the actual source code")
63        .help("to see the actual source code for this example,\nsee `examples/file.rs`")
64        .note("this output is generated by `prologue-logger` and NOT by `cargo`")
65        .finish()
66        .log("file");
67
68    Ok(())
69}