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 /// # std::fs::remove_file("test.log");
17 /// let mut log = FileLogger::new("test.log", true).unwrap();
18 /// flog!(log, "A simple log: {}", "Hello!");
23 pub struct FileLogger
{
28 /// Log messages to [FileLogger](tools/struct.FileLogger.html)
31 ($log
:expr
, $
($arg
:tt
)*) => ({
32 $log
.log(format
!($
($arg
)*));
38 pub fn new
<P
: AsRef
<std
::path
::Path
>>(file_name
: P
, to_stdout
: bool
) -> Result
<Self, Error
> {
40 let file
= std
::fs
::OpenOptions
::new()
46 Ok(Self { file , to_stdout }
)
49 pub fn log
<S
: AsRef
<str>>(&mut self, msg
: S
) {
51 let msg
= msg
.as_ref();
53 let mut stdout
= std
::io
::stdout();
55 stdout
.write_all(msg
.as_bytes()).unwrap();
56 stdout
.write_all(b
"\n").unwrap();
59 let line
= format
!("{}: {}\n", Local
.timestamp(Local
::now().timestamp(), 0).to_rfc3339(), msg
);
60 self.file
.write_all(line
.as_bytes()).unwrap();
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); }
70 fn flush(&mut self) -> Result
<(), std
::io
::Error
> {
71 if self.to_stdout { let _ = std::io::stdout().flush(); }