Skip to content

Commit

Permalink
TermLogger: Expose termcolor::ColorChoice
Browse files Browse the repository at this point in the history
Command line interfaces that write colored output usually give users
an option to turn it off, or make it automatically shut off when writing
to a file, pipe, or unsupported terminal. termcolor already has some
nice machinery to handle this sort of thing with ColorChoice, so expose
it when creating a TermLogger.

Programmers (such as myself) who use simplelog and want to give users
this choice only have ugly alternatives. For example, you could fall
back to a WriteLogger if the user doesn't want color, but then you:

- Lose out on the "mixed" logging mode you get from TerminalMode::Mixed

- Have to reimplement nice ColorChoice::Auto behavior yourself,
  on _top_ of termcolor.
  • Loading branch information
mrkline committed Mar 26, 2021
1 parent d87ea5c commit a17ca28
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 22 deletions.
2 changes: 1 addition & 1 deletion examples/custom_colors.rs
Expand Up @@ -8,7 +8,7 @@ fn main() {
.set_level_color(Level::Trace, Some(Color::Green))
.build();

TermLogger::init(LevelFilter::Trace, config, TerminalMode::Stdout).unwrap();
TermLogger::init(LevelFilter::Trace, config, TerminalMode::Stdout, ColorChoice::Auto).unwrap();
error!("Magenta error");
warn!("Yellow warning");
info!("Blue info");
Expand Down
9 changes: 7 additions & 2 deletions examples/default_colors.rs
Expand Up @@ -3,7 +3,12 @@ use simplelog::*;

#[cfg(feature = "termcolor")]
fn main() {
TermLogger::init(LevelFilter::Trace, Config::default(), TerminalMode::Stdout).unwrap();
TermLogger::init(
LevelFilter::Trace,
Config::default(),
TerminalMode::Stdout,
ColorChoice::Auto
).unwrap();
error!("Red error");
warn!("Yellow warning");
info!("Blue info");
Expand All @@ -14,4 +19,4 @@ fn main() {
#[cfg(not(feature = "termcolor"))]
fn main() {
println!("this example requires the termcolor feature.");
}
}
7 changes: 6 additions & 1 deletion examples/rgb_colors.rs
Expand Up @@ -11,7 +11,12 @@ fn main() {
.set_level_color(Level::Trace, Some(Color::Rgb(127, 127, 255)))
.build();

TermLogger::init(LevelFilter::Trace, config, TerminalMode::Stdout).unwrap();
TermLogger::init(
LevelFilter::Trace,
config,
TerminalMode::Stdout,
ColorChoice::Auto
).unwrap();
error!("Red error");
warn!("Orange warning");
info!("Yellow info");
Expand Down
7 changes: 6 additions & 1 deletion examples/usage.rs
Expand Up @@ -6,7 +6,12 @@ use std::fs::File;
fn main() {
CombinedLogger::init(vec![
#[cfg(feature = "termcolor")]
TermLogger::new(LevelFilter::Warn, Config::default(), TerminalMode::Mixed),
TermLogger::new(
LevelFilter::Warn,
Config::default(),
TerminalMode::Mixed,
ColorChoice::Auto
),
#[cfg(not(feature = "termcolor"))]
SimpleLogger::new(LevelFilter::Warn, Config::default()),
WriteLogger::new(
Expand Down
12 changes: 6 additions & 6 deletions src/lib.rs
Expand Up @@ -31,7 +31,7 @@ pub use self::loggers::{CombinedLogger, SimpleLogger, WriteLogger};
#[cfg(feature = "termcolor")]
pub use self::loggers::{TermLogger, TerminalMode};
#[cfg(feature = "termcolor")]
pub use termcolor::Color;
pub use termcolor::{Color, ColorChoice};

pub use log::{Level, LevelFilter};

Expand Down Expand Up @@ -126,7 +126,7 @@ mod tests {
);
#[cfg(feature = "termcolor")]
vec.push(
TermLogger::new(LevelFilter::Error, conf.clone(), TerminalMode::Mixed)
TermLogger::new(LevelFilter::Error, conf.clone(), TerminalMode::Mixed, ColorChoice::Auto)
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
Expand All @@ -143,7 +143,7 @@ mod tests {
);
#[cfg(feature = "termcolor")]
vec.push(
TermLogger::new(LevelFilter::Warn, conf.clone(), TerminalMode::Mixed)
TermLogger::new(LevelFilter::Warn, conf.clone(), TerminalMode::Mixed, ColorChoice::Auto)
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
Expand All @@ -160,7 +160,7 @@ mod tests {
);
#[cfg(feature = "termcolor")]
vec.push(
TermLogger::new(LevelFilter::Info, conf.clone(), TerminalMode::Mixed)
TermLogger::new(LevelFilter::Info, conf.clone(), TerminalMode::Mixed, ColorChoice::Auto)
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
Expand All @@ -177,7 +177,7 @@ mod tests {
);
#[cfg(feature = "termcolor")]
vec.push(
TermLogger::new(LevelFilter::Debug, conf.clone(), TerminalMode::Mixed)
TermLogger::new(LevelFilter::Debug, conf.clone(), TerminalMode::Mixed, ColorChoice::Auto)
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
Expand All @@ -194,7 +194,7 @@ mod tests {
);
#[cfg(feature = "termcolor")]
vec.push(
TermLogger::new(LevelFilter::Trace, conf.clone(), TerminalMode::Mixed)
TermLogger::new(LevelFilter::Trace, conf.clone(), TerminalMode::Mixed, ColorChoice::Auto)
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
Expand Down
4 changes: 2 additions & 2 deletions src/loggers/comblog.rs
Expand Up @@ -37,7 +37,7 @@ impl CombinedLogger {
/// let _ = CombinedLogger::init(
/// vec![
/// # #[cfg(feature = "termcolor")]
/// TermLogger::new(LevelFilter::Info, Config::default(), TerminalMode::Mixed),
/// TermLogger::new(LevelFilter::Info, Config::default(), TerminalMode::Mixed, ColorChoice::Auto),
/// WriteLogger::new(LevelFilter::Info, Config::default(), File::create("my_rust_bin.log").unwrap())
/// ]
/// );
Expand Down Expand Up @@ -68,7 +68,7 @@ impl CombinedLogger {
/// let combined_logger = CombinedLogger::new(
/// vec![
/// # #[cfg(feature = "termcolor")]
/// TermLogger::new(LevelFilter::Debug, Config::default(), TerminalMode::Mixed),
/// TermLogger::new(LevelFilter::Debug, Config::default(), TerminalMode::Mixed, ColorChoice::Auto),
/// WriteLogger::new(LevelFilter::Info, Config::default(), File::create("my_rust_bin.log").unwrap())
/// ]
/// );
Expand Down
30 changes: 21 additions & 9 deletions src/loggers/termlog.rs
Expand Up @@ -68,15 +68,21 @@ impl TermLogger {
/// # extern crate simplelog;
/// # use simplelog::*;
/// # fn main() {
/// TermLogger::init(LevelFilter::Info, Config::default(), TerminalMode::Mixed);
/// TermLogger::init(
/// LevelFilter::Info,
/// Config::default(),
/// TerminalMode::Mixed,
/// ColorChoice::Auto
/// );
/// # }
/// ```
pub fn init(
log_level: LevelFilter,
config: Config,
mode: TerminalMode,
color_choice: ColorChoice
) -> Result<(), SetLoggerError> {
let logger = TermLogger::new(log_level, config, mode);
let logger = TermLogger::new(log_level, config, mode, color_choice);
set_max_level(log_level.clone());
set_boxed_logger(logger)?;
Ok(())
Expand All @@ -96,26 +102,32 @@ impl TermLogger {
/// # extern crate simplelog;
/// # use simplelog::*;
/// # fn main() {
/// let term_logger = TermLogger::new(LevelFilter::Info, Config::default(), TerminalMode::Mixed);
/// let term_logger = TermLogger::new(
/// LevelFilter::Info,
/// Config::default(),
/// TerminalMode::Mixed,
/// ColorChoice::Auto
/// );
/// # }
/// ```
pub fn new(
log_level: LevelFilter,
config: Config,
mode: TerminalMode,
color_choice: ColorChoice
) -> Box<TermLogger> {
let streams = match mode {
TerminalMode::Stdout => OutputStreams {
err: StdTerminal::Stdout(Box::new(StandardStream::stdout(ColorChoice::Always))),
out: StdTerminal::Stdout(Box::new(StandardStream::stdout(ColorChoice::Always)))
err: StdTerminal::Stdout(Box::new(StandardStream::stdout(color_choice))),
out: StdTerminal::Stdout(Box::new(StandardStream::stdout(color_choice)))
},
TerminalMode::Stderr => OutputStreams {
err: StdTerminal::Stderr(Box::new(StandardStream::stderr(ColorChoice::Always))),
out: StdTerminal::Stderr(Box::new(StandardStream::stderr(ColorChoice::Always)))
err: StdTerminal::Stderr(Box::new(StandardStream::stderr(color_choice))),
out: StdTerminal::Stderr(Box::new(StandardStream::stderr(color_choice)))
},
TerminalMode::Mixed => OutputStreams {
err: StdTerminal::Stderr(Box::new(StandardStream::stderr(ColorChoice::Always))),
out: StdTerminal::Stdout(Box::new(StandardStream::stdout(ColorChoice::Always)))
err: StdTerminal::Stderr(Box::new(StandardStream::stderr(color_choice))),
out: StdTerminal::Stdout(Box::new(StandardStream::stdout(color_choice)))
},
};

Expand Down

0 comments on commit a17ca28

Please sign in to comment.