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}