don't write to stdout when already writing to file with file logs by default

This commit is contained in:
Данила Горнушко 2024-06-04 19:02:39 +03:00
parent 6610176f4b
commit acac35dbe3

View file

@ -116,15 +116,25 @@ struct Args {
#[arg(long, default_value = "waveform")]
name: String,
#[arg(short = 'a', long = "apath")]
#[arg(
short = 'a',
long = "apath",
help = "Write app logs to specified file instead of stdout"
)]
app_logs_path: Option<String>,
#[arg(short = 's', long = "spath")]
#[arg(short = 's', long = "spath", help = "Path to file with stats")]
stat_logs_path: Option<String>,
#[arg(short = 'w', long, help = "Not saving wavs if isn't set")]
wavs_path: Option<String>,
#[arg(
long,
help = "Write logs to stdout even when app_logs_path is specified"
)]
force_stdout: bool,
#[arg(short, long, action = clap::ArgAction::Count)]
verbose: u8,
}
@ -133,6 +143,7 @@ fn init_logger(
verbosity: u8,
app_log_path: Option<&Path>,
stat_log_path: Option<&Path>,
force_stdout: bool,
) -> Result<(), fern::InitError> {
let log_level = match verbosity {
0 => LevelFilter::Info,
@ -180,33 +191,44 @@ fn init_logger(
.chain(fern::log_file(path).unwrap())
});
let stdout_dispatch = Dispatch::new()
.format(|out, message, record| {
let now = Local::now();
let message = message.to_string();
let level = match record.level() {
Level::Error => "ERROR".red().to_string(),
Level::Warn => "WARN".yellow().to_string(),
Level::Info => "INFO".green().to_string(),
Level::Debug => "DEBUG".blue().to_string(),
Level::Trace => "TRACE".purple().to_string(),
};
out.finish(format_args!(
"{} [{}] - {}",
now.format(time_format_string),
level,
if record.target() == "stats10min" {
Stats10Min::nice_log_format(&message)
.expect("Couldn't get nice string for 10-min stats!")
} else {
message
}
))
})
.level(log_level)
.chain(std::io::stdout());
let stdout_dispatch = if app_dispatch.is_none() || force_stdout {
Some(
Dispatch::new()
.format(|out, message, record| {
let now = Local::now();
let message = message.to_string();
let level = match record.level() {
Level::Error => "ERROR".red().to_string(),
Level::Warn => "WARN".yellow().to_string(),
Level::Info => "INFO".green().to_string(),
Level::Debug => "DEBUG".blue().to_string(),
Level::Trace => "TRACE".purple().to_string(),
};
out.finish(format_args!(
"{} [{}] - {}",
now.format(time_format_string),
level,
if record.target() == "stats10min" {
Stats10Min::nice_log_format(&message)
.expect("Couldn't get nice string for 10-min stats!")
} else {
message
}
))
})
.level(log_level)
.chain(std::io::stdout()),
)
} else {
None
};
let root_dispatch = Dispatch::new().chain(stdout_dispatch);
let root_dispatch = Dispatch::new();
let root_dispatch = match stdout_dispatch {
Some(dispatch) => root_dispatch.chain(dispatch),
None => root_dispatch,
};
let root_dispatch = match stat_dispatch {
Some(dispatch) => root_dispatch.chain(dispatch),
None => root_dispatch,
@ -225,8 +247,13 @@ fn main() {
let args = Args::parse();
let app_logs_path = args.app_logs_path.as_deref().map(Path::new);
let stat_logs_path = args.stat_logs_path.as_deref().map(Path::new);
init_logger(args.verbose, app_logs_path, stat_logs_path)
.expect("Failed to initialize the logger");
init_logger(
args.verbose,
app_logs_path,
stat_logs_path,
args.force_stdout,
)
.expect("Failed to initialize the logger");
assert!(
args.request_rate >= 1 && args.request_rate <= 100,