Skip to content
This repository was archived by the owner on Jul 4, 2022. It is now read-only.

Commit 6abbbd6

Browse files
authored
Add CLI argument to disable log color output (#7795)
1 parent f1d8be8 commit 6abbbd6

File tree

4 files changed

+71
-27
lines changed

4 files changed

+71
-27
lines changed

client/cli/src/config.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::arg_enums::Database;
2222
use crate::error::Result;
2323
use crate::{
2424
init_logger, DatabaseParams, ImportParams, KeystoreParams, NetworkParams, NodeKeyParams,
25-
OffchainWorkerParams, PruningParams, SharedParams, SubstrateCli,
25+
OffchainWorkerParams, PruningParams, SharedParams, SubstrateCli, InitLoggerParams,
2626
};
2727
use log::warn;
2828
use names::{Generator, Name};
@@ -538,6 +538,11 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
538538
Ok(self.shared_params().is_log_filter_reloading_disabled())
539539
}
540540

541+
/// Should the log color output be disabled?
542+
fn disable_log_color(&self) -> Result<bool> {
543+
Ok(self.shared_params().disable_log_color())
544+
}
545+
541546
/// Initialize substrate. This must be done only once per process.
542547
///
543548
/// This method:
@@ -550,15 +555,17 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
550555
let tracing_receiver = self.tracing_receiver()?;
551556
let tracing_targets = self.tracing_targets()?;
552557
let disable_log_reloading = self.is_log_filter_reloading_disabled()?;
558+
let disable_log_color = self.disable_log_color()?;
553559

554560
sp_panic_handler::set(&C::support_url(), &C::impl_version());
555561

556-
init_logger(
557-
&logger_pattern,
562+
init_logger(InitLoggerParams {
563+
pattern: logger_pattern,
558564
tracing_receiver,
559565
tracing_targets,
560566
disable_log_reloading,
561-
)?;
567+
disable_log_color,
568+
})?;
562569

563570
if let Some(new_limit) = fdlimit::raise_fd_limit() {
564571
if new_limit < RECOMMENDED_OPEN_FILE_DESCRIPTOR_LIMIT {

client/cli/src/lib.rs

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -237,30 +237,50 @@ pub trait SubstrateCli: Sized {
237237
fn native_runtime_version(chain_spec: &Box<dyn ChainSpec>) -> &'static RuntimeVersion;
238238
}
239239

240+
/// The parameters for [`init_logger`].
241+
#[derive(Default)]
242+
pub struct InitLoggerParams {
243+
/// A comma seperated list of logging patterns.
244+
///
245+
/// E.g.: `test-crate=debug`
246+
pub pattern: String,
247+
/// The tracing receiver.
248+
pub tracing_receiver: sc_tracing::TracingReceiver,
249+
/// Optional comma seperated list of tracing targets.
250+
pub tracing_targets: Option<String>,
251+
/// Should log reloading be disabled?
252+
pub disable_log_reloading: bool,
253+
/// Should the log color output be disabled?
254+
pub disable_log_color: bool,
255+
}
256+
240257
/// Initialize the global logger
241258
///
242259
/// This sets various global logging and tracing instances and thus may only be called once.
243260
pub fn init_logger(
244-
pattern: &str,
245-
tracing_receiver: sc_tracing::TracingReceiver,
246-
profiling_targets: Option<String>,
247-
disable_log_reloading: bool,
261+
InitLoggerParams {
262+
pattern,
263+
tracing_receiver,
264+
tracing_targets,
265+
disable_log_reloading,
266+
disable_log_color,
267+
}: InitLoggerParams,
248268
) -> std::result::Result<(), String> {
249269
use sc_tracing::parse_default_directive;
250270

251271
// Accept all valid directives and print invalid ones
252-
fn parse_user_directives(mut env_filter: EnvFilter, dirs: &str) -> std::result::Result<EnvFilter, String> {
272+
fn parse_user_directives(
273+
mut env_filter: EnvFilter,
274+
dirs: &str,
275+
) -> std::result::Result<EnvFilter, String> {
253276
for dir in dirs.split(',') {
254277
env_filter = env_filter.add_directive(parse_default_directive(&dir)?);
255278
}
256279
Ok(env_filter)
257280
}
258281

259-
if let Err(e) = tracing_log::LogTracer::init() {
260-
return Err(format!(
261-
"Registering Substrate logger failed: {:}!", e
262-
))
263-
}
282+
tracing_log::LogTracer::init()
283+
.map_err(|e| format!("Registering Substrate logger failed: {:}!", e))?;
264284

265285
// Initialize filter - ensure to use `parse_default_directive` for any defaults to persist
266286
// after log filter reloading by RPC
@@ -290,7 +310,7 @@ pub fn init_logger(
290310
if pattern != "" {
291311
// We're not sure if log or tracing is available at this moment, so silently ignore the
292312
// parse error.
293-
env_filter = parse_user_directives(env_filter, pattern)?;
313+
env_filter = parse_user_directives(env_filter, &pattern)?;
294314
}
295315

296316
// If we're only logging `INFO` entries then we'll use a simplified logging format.
@@ -308,11 +328,11 @@ pub fn init_logger(
308328
);
309329

310330
// Make sure to include profiling targets in the filter
311-
if let Some(profiling_targets) = profiling_targets.clone() {
312-
env_filter = parse_user_directives(env_filter, &profiling_targets)?;
331+
if let Some(tracing_targets) = tracing_targets.clone() {
332+
env_filter = parse_user_directives(env_filter, &tracing_targets)?;
313333
}
314334

315-
let enable_color = atty::is(atty::Stream::Stderr);
335+
let enable_color = atty::is(atty::Stream::Stderr) && !disable_log_color;
316336
let timer = ChronoLocal::with_format(if simple {
317337
"%Y-%m-%d %H:%M:%S".to_string()
318338
} else {
@@ -333,15 +353,15 @@ pub fn init_logger(
333353
let subscriber = subscriber_builder
334354
.finish()
335355
.with(logging::NodeNameLayer);
336-
initialize_tracing(subscriber, tracing_receiver, profiling_targets)
356+
initialize_tracing(subscriber, tracing_receiver, tracing_targets)
337357
} else {
338358
let subscriber_builder = subscriber_builder.with_filter_reloading();
339359
let handle = subscriber_builder.reload_handle();
340360
sc_tracing::set_reload_handle(handle);
341361
let subscriber = subscriber_builder
342362
.finish()
343363
.with(logging::NodeNameLayer);
344-
initialize_tracing(subscriber, tracing_receiver, profiling_targets)
364+
initialize_tracing(subscriber, tracing_receiver, tracing_targets)
345365
}
346366
}
347367

@@ -380,7 +400,9 @@ mod tests {
380400
#[test]
381401
fn test_logger_filters() {
382402
let test_pattern = "afg=debug,sync=trace,client=warn,telemetry,something-with-dash=error";
383-
init_logger(&test_pattern, Default::default(), Default::default(), false).unwrap();
403+
init_logger(
404+
InitLoggerParams { pattern: test_pattern.into(), ..Default::default() },
405+
).unwrap();
384406

385407
tracing::dispatcher::get_default(|dispatcher| {
386408
let test_filter = |target, level| {
@@ -439,7 +461,9 @@ mod tests {
439461
fn log_something_with_dash_target_name() {
440462
if env::var("ENABLE_LOGGING").is_ok() {
441463
let test_pattern = "test-target=info";
442-
init_logger(&test_pattern, Default::default(), Default::default(), false).unwrap();
464+
init_logger(
465+
InitLoggerParams { pattern: test_pattern.into(), ..Default::default() },
466+
).unwrap();
443467

444468
log::info!(target: "test-target", "{}", EXPECTED_LOG_MESSAGE);
445469
}
@@ -475,7 +499,9 @@ mod tests {
475499
fn prefix_in_log_lines_entrypoint() {
476500
if env::var("ENABLE_LOGGING").is_ok() {
477501
let test_pattern = "test-target=info";
478-
init_logger(&test_pattern, Default::default(), Default::default(), false).unwrap();
502+
init_logger(
503+
InitLoggerParams { pattern: test_pattern.into(), ..Default::default() },
504+
).unwrap();
479505
prefix_in_log_lines_process();
480506
}
481507
}
@@ -491,7 +517,7 @@ mod tests {
491517
#[test]
492518
fn do_not_write_with_colors_on_tty_entrypoint() {
493519
if env::var("ENABLE_LOGGING").is_ok() {
494-
init_logger("", Default::default(), Default::default(), false).unwrap();
520+
init_logger(InitLoggerParams::default()).unwrap();
495521
log::info!("{}", ansi_term::Colour::Yellow.paint(EXPECTED_LOG_MESSAGE));
496522
}
497523
}

client/cli/src/params/shared_params.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ pub struct SharedParams {
4646
#[structopt(short = "l", long, value_name = "LOG_PATTERN")]
4747
pub log: Vec<String>,
4848

49+
/// Disable log color output.
50+
#[structopt(long)]
51+
pub disable_log_color: bool,
52+
4953
/// Disable feature to dynamically update and reload the log filter.
5054
///
5155
/// By default this feature is enabled, however it leads to a small performance decrease.
@@ -99,6 +103,11 @@ impl SharedParams {
99103
&self.log
100104
}
101105

106+
/// Should the log color output be disabled?
107+
pub fn disable_log_color(&self) -> bool {
108+
self.disable_log_color
109+
}
110+
102111
/// Is log reloading disabled
103112
pub fn is_log_filter_reloading_disabled(&self) -> bool {
104113
self.disable_log_reloading

client/rpc/src/system/tests.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,13 +344,15 @@ fn test_add_reset_log_filter() {
344344

345345
// Enter log generation / filter reload
346346
if std::env::var("TEST_LOG_FILTER").is_ok() {
347-
sc_cli::init_logger("test_before_add=debug", Default::default(), Default::default(), false).unwrap();
347+
sc_cli::init_logger(
348+
sc_cli::InitLoggerParams { pattern: "test_before_add=debug".into(), ..Default::default() },
349+
).unwrap();
348350
for line in std::io::stdin().lock().lines() {
349351
let line = line.expect("Failed to read bytes");
350352
if line.contains("add_reload") {
351-
assert!(api(None).system_add_log_filter("test_after_add".to_owned()).is_ok(), "`system_add_log_filter` failed");
353+
api(None).system_add_log_filter("test_after_add".into()).expect("`system_add_log_filter` failed");
352354
} else if line.contains("reset") {
353-
assert!(api(None).system_reset_log_filter().is_ok(), "`system_reset_log_filter` failed");
355+
api(None).system_reset_log_filter().expect("`system_reset_log_filter` failed");
354356
} else if line.contains("exit") {
355357
return;
356358
}

0 commit comments

Comments
 (0)