2 use chrono
::{TimeZone, Local}
;
5 /// Log messages with timestamps into files
7 /// Logs messages to file, and optionaly to standart output.
12 /// #[macro_use] extern crate proxmox_backup;
14 /// use proxmox_backup::tools::FileLogger;
16 /// let mut log = FileLogger::new("test.log", true).unwrap();
17 /// flog!(log, "A simple log: {}", "Hello!");
22 pub struct FileLogger
{
27 /// Log messages to [FileLogger](tools/struct.FileLogger.html)
30 ($log
:expr
, $
($arg
:tt
)*) => ({
31 $log
.log(format
!($
($arg
)*));
37 pub fn new
<P
: AsRef
<std
::path
::Path
>>(file_name
: P
, to_stdout
: bool
) -> Result
<Self, Error
> {
39 let file
= std
::fs
::OpenOptions
::new()
45 Ok(Self { file , to_stdout }
)
48 pub fn log
<S
: AsRef
<str>>(&mut self, msg
: S
) {
50 let msg
= msg
.as_ref();
52 let mut stdout
= std
::io
::stdout();
54 stdout
.write(msg
.as_bytes()).unwrap();
55 stdout
.write(b
"\n").unwrap();
58 let line
= format
!("{}: {}\n", Local
.timestamp(Local
::now().timestamp(), 0).to_rfc3339(), msg
);
59 self.file
.write(line
.as_bytes()).unwrap();
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); }
69 fn flush(&mut self) -> Result
<(), std
::io
::Error
> {
70 if self.to_stdout { let _ = std::io::stdout().flush(); }