]> git.proxmox.com Git - proxmox-backup.git/blob - src/tools/file_logger.rs
src/tools/file_logger.rs: new - accept AsRef<Path>
[proxmox-backup.git] / src / tools / file_logger.rs
1 use failure::*;
2 use chrono::{TimeZone, Local};
3 use std::io::Write;
4
5 /// Log messages with timestamps into files
6 ///
7 /// Logs messages to file, and optionaly to standart output.
8 ///
9 ///
10 /// #### Example:
11 /// ```
12 /// #[macro_use] extern crate proxmox_backup;
13 /// # use failure::*;
14 /// use proxmox_backup::tools::FileLogger;
15 ///
16 /// let mut log = FileLogger::new("test.log", true).unwrap();
17 /// flog!(log, "A simple log: {}", "Hello!");
18 /// ```
19
20
21 #[derive(Debug)]
22 pub struct FileLogger {
23 file: std::fs::File,
24 to_stdout: bool,
25 }
26
27 /// Log messages to [FileLogger](tools/struct.FileLogger.html)
28 #[macro_export]
29 macro_rules! flog {
30 ($log:expr, $($arg:tt)*) => ({
31 $log.log(format!($($arg)*));
32 })
33 }
34
35 impl FileLogger {
36
37 pub fn new<P: AsRef<std::path::Path>>(file_name: P, to_stdout: bool) -> Result<Self, Error> {
38
39 let file = std::fs::OpenOptions::new()
40 .read(true)
41 .write(true)
42 .create_new(true)
43 .open(file_name)?;
44
45 Ok(Self { file , to_stdout })
46 }
47
48 pub fn log<S: AsRef<str>>(&mut self, msg: S) {
49
50 let msg = msg.as_ref();
51
52 let mut stdout = std::io::stdout();
53 if self.to_stdout {
54 stdout.write(msg.as_bytes()).unwrap();
55 stdout.write(b"\n").unwrap();
56 }
57
58 let line = format!("{}: {}\n", Local.timestamp(Local::now().timestamp(), 0).to_rfc3339(), msg);
59 self.file.write(line.as_bytes()).unwrap();
60 }
61 }
62
63 impl std::io::Write for FileLogger {
64 fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
65 if self.to_stdout { let _ = std::io::stdout().write(buf); }
66 self.file.write(buf)
67 }
68
69 fn flush(&mut self) -> Result<(), std::io::Error> {
70 if self.to_stdout { let _ = std::io::stdout().flush(); }
71 self.file.flush()
72 }
73 }