]> git.proxmox.com Git - proxmox-backup.git/blob - src/tools/file_logger.rs
0861724dc0ac47741440a765880822b97948f124
[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 /// # std::fs::remove_file("test.log");
17 /// let mut log = FileLogger::new("test.log", true).unwrap();
18 /// flog!(log, "A simple log: {}", "Hello!");
19 /// ```
20
21
22 #[derive(Debug)]
23 pub struct FileLogger {
24 file: std::fs::File,
25 to_stdout: bool,
26 }
27
28 /// Log messages to [FileLogger](tools/struct.FileLogger.html)
29 #[macro_export]
30 macro_rules! flog {
31 ($log:expr, $($arg:tt)*) => ({
32 $log.log(format!($($arg)*));
33 })
34 }
35
36 impl FileLogger {
37
38 pub fn new<P: AsRef<std::path::Path>>(file_name: P, to_stdout: bool) -> Result<Self, Error> {
39
40 let file = std::fs::OpenOptions::new()
41 .read(true)
42 .write(true)
43 .create_new(true)
44 .open(file_name)?;
45
46 Ok(Self { file , to_stdout })
47 }
48
49 pub fn log<S: AsRef<str>>(&mut self, msg: S) {
50
51 let msg = msg.as_ref();
52
53 let mut stdout = std::io::stdout();
54 if self.to_stdout {
55 stdout.write_all(msg.as_bytes()).unwrap();
56 stdout.write_all(b"\n").unwrap();
57 }
58
59 let line = format!("{}: {}\n", Local.timestamp(Local::now().timestamp(), 0).to_rfc3339(), msg);
60 self.file.write_all(line.as_bytes()).unwrap();
61 }
62 }
63
64 impl std::io::Write for FileLogger {
65 fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
66 if self.to_stdout { let _ = std::io::stdout().write(buf); }
67 self.file.write(buf)
68 }
69
70 fn flush(&mut self) -> Result<(), std::io::Error> {
71 if self.to_stdout { let _ = std::io::stdout().flush(); }
72 self.file.flush()
73 }
74 }