11use std:: {
22 fs,
3- io:: stderr,
3+ io:: { self , stderr} ,
44 sync:: {
55 atomic:: { AtomicBool , Ordering } ,
66 mpsc:: { self , RecvTimeoutError } ,
@@ -13,6 +13,7 @@ use std::{
1313use anyhow:: Context ;
1414use args:: Args ;
1515use camino:: { Utf8Path , Utf8PathBuf } ;
16+ use chrono:: Local ;
1617use crossterm:: {
1718 event:: { KeyCode , KeyModifiers } ,
1819 terminal:: {
@@ -22,9 +23,8 @@ use crossterm::{
2223 ExecutableCommand ,
2324} ;
2425use directories:: ProjectDirs ;
25- use flexi_logger:: { FileSpec , Logger , WriteMode } ;
2626use indicatif:: { MultiProgress , ProgressBar , ProgressStyle } ;
27- use log:: { error, info, trace} ;
27+ use log:: { debug , error, info, trace, LevelFilter } ;
2828use rand:: { seq:: SliceRandom , thread_rng} ;
2929use ratatui:: {
3030 backend:: { Backend , CrosstermBackend } ,
@@ -38,6 +38,7 @@ use redu::{
3838 restic:: { self , escape_for_exclude, Restic , Snapshot } ,
3939} ;
4040use scopeguard:: defer;
41+ use simplelog:: { ThreadLogMode , WriteLogger } ;
4142use thiserror:: Error ;
4243use util:: snapshot_short_id;
4344
@@ -54,21 +55,39 @@ fn main() -> anyhow::Result<()> {
5455 let dirs = ProjectDirs :: from ( "eu" , "drdo" , "redu" )
5556 . expect ( "unable to determine project directory" ) ;
5657
57- let _logger = {
58- let mut directory = dirs. data_local_dir ( ) . to_path_buf ( ) ;
59- directory. push ( Utf8Path :: new ( "logs" ) ) ;
58+ // Initialize the logger
59+ {
60+ fn generate_filename ( ) -> String {
61+ format ! ( "{}.log" , Local :: now( ) . format( "%Y-%m-%dT%H:%M:%S%.f%:z" ) )
62+ }
6063
61- eprintln ! ( "Logging to {:#?}" , directory) ;
64+ let mut path = dirs. data_local_dir ( ) . to_path_buf ( ) ;
65+ path. push ( Utf8Path :: new ( "logs" ) ) ;
66+ fs:: create_dir_all ( & path) ?;
67+ path. push ( generate_filename ( ) ) ;
68+ let file = loop {
69+ // Spin until we hit a timestamp that isn't taken yet.
70+ // With the level of precision that we are using this should virtually
71+ // never run more than once.
72+ match fs:: OpenOptions :: new ( )
73+ . write ( true )
74+ . create_new ( true )
75+ . open ( & path)
76+ {
77+ Err ( err) if err. kind ( ) == io:: ErrorKind :: AlreadyExists =>
78+ path. set_file_name ( generate_filename ( ) ) ,
79+ x => break x,
80+ }
81+ } ?;
6282
63- let filespec =
64- { FileSpec :: default ( ) . directory ( directory) . suppress_basename ( ) } ;
83+ eprintln ! ( "Logging to {:#?}" , path) ;
6584
66- Logger :: with ( args . log_level )
67- . log_to_file ( filespec )
68- . write_mode ( WriteMode :: BufferAndFlush )
69- . format ( flexi_logger :: with_thread )
70- . start ( ) ?
71- } ;
85+ let config = simplelog :: ConfigBuilder :: new ( )
86+ . set_target_level ( LevelFilter :: Error )
87+ . set_thread_mode ( ThreadLogMode :: Names )
88+ . build ( ) ;
89+ WriteLogger :: init ( args . log_level , config , file ) ? ;
90+ }
7291
7392 unsafe {
7493 rusqlite:: trace:: config_log ( Some ( |code, msg| {
@@ -292,17 +311,15 @@ fn fetching_thread_body(
292311 "snapshot fetched in {}s ({short_id})" ,
293312 start. elapsed( ) . as_secs_f64( )
294313 ) ;
295- trace ! ( "got snapshot, sending ({short_id})" ) ;
296314 if should_quit. load ( Ordering :: SeqCst ) {
297315 return Ok ( ( ) ) ;
298316 }
299317 let start = Instant :: now ( ) ;
300318 snapshot_sender. send ( ( snapshot. clone ( ) , sizetree) ) . unwrap ( ) ;
301- info ! (
319+ debug ! (
302320 "waited {}s to send snapshot ({short_id})" ,
303321 start. elapsed( ) . as_secs_f64( )
304322 ) ;
305- trace ! ( "snapshot sent ({short_id})" ) ;
306323 }
307324 Ok ( ( ) )
308325}
@@ -332,7 +349,7 @@ fn db_thread_body(
332349 // We wait with timeout to poll the should_quit periodically
333350 match snapshot_receiver. recv_timeout ( should_quit_poll_period) {
334351 Ok ( ( snapshot, sizetree) ) => {
335- info ! (
352+ debug ! (
336353 "waited {}s to get snapshot" ,
337354 start. elapsed( ) . as_secs_f64( )
338355 ) ;
@@ -498,7 +515,7 @@ fn ui(mut cache: Cache) -> anyhow::Result<Vec<Utf8PathBuf>> {
498515fn render < ' a > (
499516 terminal : & ' a mut Terminal < impl Backend > ,
500517 app : & App ,
501- ) -> std :: io:: Result < CompletedFrame < ' a > > {
518+ ) -> io:: Result < CompletedFrame < ' a > > {
502519 terminal. draw ( |frame| {
503520 let area = frame. area ( ) ;
504521 let buf = frame. buffer_mut ( ) ;
0 commit comments