diff --git a/.gitignore b/.gitignore index 41c86c39..9978cd54 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target Cargo.lock *.log +.idea diff --git a/src/lib.rs b/src/lib.rs index 3067d1d2..0420bdec 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,7 +32,7 @@ pub use self::config::{ pub use self::loggers::TestLogger; pub use self::loggers::{CombinedLogger, SimpleLogger, WriteLogger}; #[cfg(feature = "termcolor")] -pub use self::loggers::{TermLogger, TerminalMode}; +pub use self::loggers::{Target, TermLogger, TerminalMode}; #[cfg(feature = "termcolor")] pub use termcolor::{Color, ColorChoice}; diff --git a/src/loggers/mod.rs b/src/loggers/mod.rs index f8190c0a..ea5e79e2 100644 --- a/src/loggers/mod.rs +++ b/src/loggers/mod.rs @@ -10,7 +10,7 @@ mod writelog; pub use self::comblog::CombinedLogger; pub use self::simplelog::SimpleLogger; #[cfg(feature = "termcolor")] -pub use self::termlog::{TermLogger, TerminalMode}; +pub use self::termlog::{Target, TermLogger, TerminalMode}; #[cfg(feature = "test")] pub use self::testlog::TestLogger; pub use self::writelog::WriteLogger; diff --git a/src/loggers/termlog.rs b/src/loggers/termlog.rs index 460c36e6..eda5ae37 100644 --- a/src/loggers/termlog.rs +++ b/src/loggers/termlog.rs @@ -19,22 +19,69 @@ struct OutputStreams { } /// Specifies which streams should be used when logging -#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Default)] pub enum TerminalMode { /// Only use Stdout Stdout, /// Only use Stderr Stderr, /// Use Stderr for Errors and Stdout otherwise + #[default] Mixed, + /// Use custom output streams + Custom { + /// Stream for Error logs + error: Target, + /// Stream for Warning logs + warn: Target, + /// Stream for Info logs + info: Target, + /// Stream for Debug logs + debug: Target, + /// Stream for Trace logs + trace: Target, + }, } -impl Default for TerminalMode { - fn default() -> TerminalMode { - TerminalMode::Mixed +impl TerminalMode { + /// Returns the target stream for the given log level + fn target(&self, level: Level) -> Target { + match self { + TerminalMode::Stdout => Target::Stdout, + TerminalMode::Stderr => Target::Stderr, + TerminalMode::Mixed => { + if level == Level::Error { + Target::Stderr + } else { + Target::Stdout + } + } + TerminalMode::Custom { + error, + warn, + info, + debug, + trace, + } => match level { + Level::Error => *error, + Level::Warn => *warn, + Level::Info => *info, + Level::Debug => *debug, + Level::Trace => *trace, + }, + } } } +/// Possible target streams +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] +pub enum Target { + /// Use Stdout + Stdout, + /// Use Stderr + Stderr, +} + /// The TermLogger struct. Provides a stderr/out based Logger implementation /// /// Supports colored output @@ -42,6 +89,7 @@ pub struct TermLogger { level: LevelFilter, config: Config, streams: Mutex, + mode: TerminalMode, } impl TermLogger { @@ -113,7 +161,7 @@ impl TermLogger { err: BufferedStandardStream::stderr(color_choice), out: BufferedStandardStream::stderr(color_choice), }, - TerminalMode::Mixed => OutputStreams { + TerminalMode::Mixed | TerminalMode::Custom { .. } => OutputStreams { err: BufferedStandardStream::stderr(color_choice), out: BufferedStandardStream::stdout(color_choice), }, @@ -123,6 +171,7 @@ impl TermLogger { level: log_level, config, streams: Mutex::new(streams), + mode, }) } @@ -201,7 +250,7 @@ impl TermLogger { let mut streams = self.streams.lock().unwrap(); - if record.level() == Level::Error { + if self.mode.target(record.level()) == Target::Stderr { self.try_log_term(record, &mut streams.err) } else { self.try_log_term(record, &mut streams.out)