Skip to content

Commit 5dcea43

Browse files
committed
fix: initialize loggin once
`setup_logging` cannot be called twice becuase it panics.
1 parent d2c69fa commit 5dcea43

File tree

2 files changed

+25
-19
lines changed

2 files changed

+25
-19
lines changed

src/logging.rs

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
1-
use log::info;
1+
use std::str::FromStr;
2+
use std::sync::Once;
3+
4+
use log::{info, LevelFilter};
25

36
use crate::Configuration;
47

8+
static INIT: Once = Once::new();
9+
510
pub fn setup_logging(cfg: &Configuration) {
6-
let log_level = match &cfg.log_level {
7-
None => log::LevelFilter::Info,
8-
Some(level) => match level.as_str() {
9-
"off" => log::LevelFilter::Off,
10-
"trace" => log::LevelFilter::Trace,
11-
"debug" => log::LevelFilter::Debug,
12-
"info" => log::LevelFilter::Info,
13-
"warn" => log::LevelFilter::Warn,
14-
"error" => log::LevelFilter::Error,
15-
_ => {
16-
panic!("Unknown log level encountered: '{}'", level.as_str());
17-
}
18-
},
19-
};
20-
21-
if log_level == log::LevelFilter::Off {
11+
let level = config_level_or_default(&cfg.log_level);
12+
13+
if level == log::LevelFilter::Off {
2214
return;
2315
}
2416

17+
INIT.call_once(|| {
18+
stdout_config(level);
19+
});
20+
}
21+
22+
fn config_level_or_default(log_level: &Option<String>) -> LevelFilter {
23+
match log_level {
24+
None => log::LevelFilter::Info,
25+
Some(level) => LevelFilter::from_str(level).unwrap(),
26+
}
27+
}
28+
29+
fn stdout_config(level: LevelFilter) {
2530
if let Err(_err) = fern::Dispatch::new()
2631
.format(|out, message, record| {
2732
out.finish(format_args!(
@@ -32,11 +37,12 @@ pub fn setup_logging(cfg: &Configuration) {
3237
message
3338
))
3439
})
35-
.level(log_level)
40+
.level(level)
3641
.chain(std::io::stdout())
3742
.apply()
3843
{
3944
panic!("Failed to initialize logging.")
4045
}
46+
4147
info!("logging initialized.");
4248
}

tests/udp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ mod udp_tracker_server {
2525

2626
fn tracker_configuration() -> Arc<Configuration> {
2727
let mut config = Configuration::default();
28-
config.log_level = Some("off".to_owned()); // "off" is necessary when running multiple trackers
28+
config.log_level = Some("off".to_owned());
2929
config.udp_trackers[0].bind_address = format!("127.0.0.1:{}", ephemeral_random_port());
3030
Arc::new(config)
3131
}

0 commit comments

Comments
 (0)