11//! This module provides a custom Logger implementation for use with the `log` crate
22use console:: style;
3- use log:: { Level , LevelFilter , Log , Metadata , Record , SetLoggerError } ;
3+ use log:: { trace , Level , LevelFilter , Log , Metadata , Record , SetLoggerError } ;
44use std:: env;
55use std:: fmt:: Display ;
66use std:: io:: IsTerminal ;
@@ -37,10 +37,12 @@ pub enum LogContext {
3737}
3838
3939/// Represents the level of verbosity that was requested by the user
40+ #[ derive( Debug , Copy , Clone ) ]
4041pub enum LogVerbosity {
4142 Quiet ,
4243 Default ,
4344 Verbose ,
45+ VeryVerbose ,
4446}
4547
4648pub struct Logger {
@@ -64,9 +66,11 @@ impl Log for Logger {
6466 match record. level ( ) {
6567 Level :: Error => self . log_error ( record. args ( ) ) ,
6668 Level :: Warn => self . log_warning ( record. args ( ) ) ,
67- Level :: Debug => eprintln ! ( "[verbose] {}" , record. args( ) ) ,
6869 // all info-level messages go to stdout
69- _ => println ! ( "{}" , record. args( ) ) ,
70+ Level :: Info => println ! ( "{}" , record. args( ) ) ,
71+ // all debug- and trace-level messages go to stderr
72+ Level :: Debug => eprintln ! ( "[verbose] {}" , record. args( ) ) ,
73+ Level :: Trace => eprintln ! ( "[trace] {}" , record. args( ) ) ,
7074 }
7175 }
7276 }
@@ -90,6 +94,7 @@ impl Logger {
9094 LogVerbosity :: Quiet => LevelFilter :: Error ,
9195 LogVerbosity :: Default => level_from_env ( ) ,
9296 LogVerbosity :: Verbose => LevelFilter :: Debug ,
97+ LogVerbosity :: VeryVerbose => LevelFilter :: Trace ,
9398 } ;
9499
95100 Logger { context, level }
@@ -159,6 +164,7 @@ fn level_from_env() -> LevelFilter {
159164 . and_then ( |level| level. to_uppercase ( ) . parse ( ) . ok ( ) )
160165 . unwrap_or_else ( || {
161166 if std:: io:: stdout ( ) . is_terminal ( ) {
167+ trace ! ( "using fallback log level (info)" ) ;
162168 LevelFilter :: Info
163169 } else {
164170 LevelFilter :: Error
0 commit comments