Skip to content

Commit eaa7f70

Browse files
authored
log fixes (#3240)
* Disregard env setting when level is set manually * Sort filter rules * Changelog * Remove no-longer-true doc line * Fex typo
1 parent d65497d commit eaa7f70

File tree

3 files changed

+84
-48
lines changed

3 files changed

+84
-48
lines changed

esp-println/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1515

1616
### Fixed
1717

18+
- Manually setting a log level now correctly ignores `ESP_LOG`. (#3240)
19+
- Fixed logging rules being order-dependent. (#3240)
20+
1821
### Removed
1922

2023
## [0.13.1] - 2025-02-24

esp-println/build.rs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ fn generate_filter_snippet() {
8181
snippet
8282
.push_str("pub(crate) fn is_enabled(level: log::Level, _target: &str) -> bool {");
8383

84+
let mut global_level = None;
8485
for directive in res.directives {
8586
let level = match directive.level {
8687
log::LevelFilter::Off => "Off",
@@ -92,18 +93,25 @@ fn generate_filter_snippet() {
9293
};
9394

9495
if let Some(name) = directive.name {
96+
// If a prefix matches, don't continue to the next directive
9597
snippet.push_str(&format!(
96-
"if _target.starts_with(\"{}\") && level <= log::LevelFilter::{} {{ return true; }}",
97-
&name, level
98-
));
99-
} else {
100-
snippet.push_str(&format!(
101-
"if level <= log::LevelFilter::{} {{ return true; }}",
102-
level
98+
"if _target.starts_with(\"{}\") {{ return level <= log::LevelFilter::{}; }}",
99+
&name, level
103100
));
101+
} else {
102+
if global_level.is_some() {
103+
panic!("Multiple global log levels specified in `ESP_LOG`");
104+
}
105+
global_level = Some(level);
104106
}
105107
}
106-
snippet.push_str(" false");
108+
109+
// Place the fallback rule at the end
110+
if let Some(level) = global_level {
111+
snippet.push_str(&format!("level <= log::LevelFilter::{}", level));
112+
} else {
113+
snippet.push_str(" false");
114+
}
107115
snippet.push('}');
108116
snippet
109117
}
@@ -183,5 +191,13 @@ fn parse_spec(spec: &str) -> ParseResult {
183191
}
184192
}
185193

194+
// Sort by length so that the most specific prefixes come first
195+
result
196+
.directives
197+
.sort_by(|a, b| match (a.name.as_ref(), b.name.as_ref()) {
198+
(Some(a), Some(b)) => b.len().cmp(&a.len()),
199+
_ => std::cmp::Ordering::Equal,
200+
});
201+
186202
result
187203
}

esp-println/src/logger.rs

Lines changed: 57 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ include!(concat!(env!("OUT_DIR"), "/log_filter.rs"));
77
include!(concat!(env!("OUT_DIR"), "\\log_filter.rs"));
88

99
/// Initialize the logger with the given maximum log level.
10-
///
11-
/// `ESP_LOG` environment variable will still be honored if set.
1210
pub fn init_logger(level: log::LevelFilter) {
1311
unsafe {
1412
log::set_logger_racy(&EspLogger).unwrap();
@@ -19,14 +17,31 @@ pub fn init_logger(level: log::LevelFilter) {
1917
/// Initialize the logger from the `ESP_LOG` environment variable.
2018
pub fn init_logger_from_env() {
2119
unsafe {
22-
log::set_logger_racy(&EspLogger).unwrap();
20+
log::set_logger_racy(&EspEnvLogger).unwrap();
2321
log::set_max_level_racy(FILTER_MAX);
2422
}
2523
}
2624

2725
struct EspLogger;
2826

2927
impl log::Log for EspLogger {
28+
#[allow(unused)]
29+
fn enabled(&self, _: &log::Metadata) -> bool {
30+
// Filtered by `log` already
31+
true
32+
}
33+
34+
#[allow(unused)]
35+
fn log(&self, record: &log::Record) {
36+
print_log_record(record);
37+
}
38+
39+
fn flush(&self) {}
40+
}
41+
42+
struct EspEnvLogger;
43+
44+
impl log::Log for EspEnvLogger {
3045
fn enabled(&self, metadata: &log::Metadata) -> bool {
3146
let level = metadata.level();
3247
let target = metadata.target();
@@ -35,49 +50,51 @@ impl log::Log for EspLogger {
3550

3651
#[allow(unused)]
3752
fn log(&self, record: &log::Record) {
38-
if !self.enabled(&record.metadata()) {
39-
return;
53+
if self.enabled(&record.metadata()) {
54+
print_log_record(record);
4055
}
41-
42-
const RESET: &str = "\u{001B}[0m";
43-
const RED: &str = "\u{001B}[31m";
44-
const GREEN: &str = "\u{001B}[32m";
45-
const YELLOW: &str = "\u{001B}[33m";
46-
const BLUE: &str = "\u{001B}[34m";
47-
const CYAN: &str = "\u{001B}[35m";
48-
49-
#[cfg(feature = "colors")]
50-
let color = match record.level() {
51-
log::Level::Error => RED,
52-
log::Level::Warn => YELLOW,
53-
log::Level::Info => GREEN,
54-
log::Level::Debug => BLUE,
55-
log::Level::Trace => CYAN,
56-
};
57-
#[cfg(feature = "colors")]
58-
let reset = RESET;
59-
60-
#[cfg(not(feature = "colors"))]
61-
let color = "";
62-
#[cfg(not(feature = "colors"))]
63-
let reset = "";
64-
65-
#[cfg(feature = "timestamp")]
66-
println!(
67-
"{}{} ({}) - {}{}",
68-
color,
69-
record.level(),
70-
unsafe { _esp_println_timestamp() },
71-
record.args(),
72-
reset
73-
);
74-
#[cfg(not(feature = "timestamp"))]
75-
println!("{}{} - {}{}", color, record.level(), record.args(), reset);
7656
}
7757

7858
fn flush(&self) {}
7959
}
8060

61+
fn print_log_record(record: &log::Record) {
62+
const RESET: &str = "\u{001B}[0m";
63+
const RED: &str = "\u{001B}[31m";
64+
const GREEN: &str = "\u{001B}[32m";
65+
const YELLOW: &str = "\u{001B}[33m";
66+
const BLUE: &str = "\u{001B}[34m";
67+
const CYAN: &str = "\u{001B}[35m";
68+
69+
#[cfg(feature = "colors")]
70+
let color = match record.level() {
71+
log::Level::Error => RED,
72+
log::Level::Warn => YELLOW,
73+
log::Level::Info => GREEN,
74+
log::Level::Debug => BLUE,
75+
log::Level::Trace => CYAN,
76+
};
77+
#[cfg(feature = "colors")]
78+
let reset = RESET;
79+
80+
#[cfg(not(feature = "colors"))]
81+
let color = "";
82+
#[cfg(not(feature = "colors"))]
83+
let reset = "";
84+
85+
#[cfg(feature = "timestamp")]
86+
println!(
87+
"{}{} ({}) - {}{}",
88+
color,
89+
record.level(),
90+
unsafe { _esp_println_timestamp() },
91+
record.args(),
92+
reset
93+
);
94+
#[cfg(not(feature = "timestamp"))]
95+
println!("{}{} - {}{}", color, record.level(), record.args(), reset);
96+
}
97+
8198
/// A user-provided hook to supply a timestamp in milliseconds for logging.
8299
///
83100
/// When enabled via the `"timestamp"` feature, this function should be

0 commit comments

Comments
 (0)