Skip to content

Commit 969e645

Browse files
jhultblackboxaicode
andcommitted
feat(core): expose init_logger publicly for uniform preprocessor logging
Preprocessor authors can now call `mdbook_core::utils::init_logger()` to use mdBook's logger configuration (MDBOOK_LOG env var, INFO default, silenced noisy deps like handlebars/html5ever). Make mdbook-core standalone: - Pin explicit `tracing-subscriber` dep (matches workspace version) - Remove redundant workspace deps/transitive resolutions Closes #2049 Co-authored-by: BlackboxAI <code@blackbox.ai>
1 parent 891e203 commit 969e645

5 files changed

Lines changed: 46 additions & 37 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ toml = "1.0.3"
6666
topological-sort = "0.2.2"
6767
tower-http = "0.6.8"
6868
tracing = "0.1.44"
69-
tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
7069
walkdir = "2.5.0"
7170

7271
[package]
@@ -96,7 +95,6 @@ mdbook-driver.workspace = true
9695
mdbook-html.workspace = true
9796
opener.workspace = true
9897
tracing.workspace = true
99-
tracing-subscriber.workspace = true
10098

10199
# Watch feature
102100
ignore = { workspace = true, optional = true }

crates/mdbook-core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ serde.workspace = true
1414
serde_json.workspace = true
1515
toml.workspace = true
1616
tracing.workspace = true
17+
tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
1718

1819
[dev-dependencies]
1920
tempfile.workspace = true

crates/mdbook-core/src/utils/mod.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,49 @@ pub mod fs;
88
mod html;
99
mod toml_ext;
1010

11+
/// Initialize the logger with mdBook's default configuration.
12+
///
13+
/// This function sets up a tracing subscriber that:
14+
/// - Uses the `MDBOOK_LOG` environment variable for filtering (or defaults to INFO level)
15+
/// - Silences noisy dependencies (handlebars, html5ever) unless explicitly requested
16+
/// - Writes to stderr
17+
/// - Shows the target only when MDBOOK_LOG is set
18+
///
19+
/// This is useful for preprocessor authors who want consistent logging
20+
/// with mdBook's internal logging.
21+
pub fn init_logger() {
22+
let filter = tracing_subscriber::EnvFilter::builder()
23+
.with_env_var("MDBOOK_LOG")
24+
.with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into())
25+
.from_env_lossy();
26+
let log_env = std::env::var("MDBOOK_LOG");
27+
// Silence some particularly noisy dependencies unless the user
28+
// specifically asks for them.
29+
let silence_unless_specified = |filter: tracing_subscriber::EnvFilter, target| {
30+
if !log_env.as_ref().map_or(false, |s| {
31+
s.split(',').any(|directive| directive.starts_with(target))
32+
}) {
33+
filter.add_directive(format!("{target}=warn").parse().unwrap())
34+
} else {
35+
filter
36+
}
37+
};
38+
let filter = silence_unless_specified(filter, "handlebars");
39+
let filter = silence_unless_specified(filter, "html5ever");
40+
41+
// Don't show the target by default, since it generally isn't useful
42+
// unless you are overriding the level.
43+
let with_target = log_env.is_ok();
44+
45+
tracing_subscriber::fmt()
46+
.without_time()
47+
.with_ansi(std::io::IsTerminal::is_terminal(&std::io::stderr()))
48+
.with_writer(std::io::stderr)
49+
.with_env_filter(filter)
50+
.with_target(with_target)
51+
.init();
52+
}
53+
1154
pub(crate) use self::toml_ext::TomlExt;
1255

1356
pub use self::html::{escape_html, escape_html_attribute};

src/main.rs

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ mod cmd;
1616
const VERSION: &str = concat!("v", clap::crate_version!());
1717

1818
fn main() {
19-
init_logger();
19+
utils::init_logger();
2020

2121
let command = create_clap_command();
2222

@@ -90,39 +90,6 @@ fn create_clap_command() -> Command {
9090
app
9191
}
9292

93-
fn init_logger() {
94-
let filter = tracing_subscriber::EnvFilter::builder()
95-
.with_env_var("MDBOOK_LOG")
96-
.with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into())
97-
.from_env_lossy();
98-
let log_env = std::env::var("MDBOOK_LOG");
99-
// Silence some particularly noisy dependencies unless the user
100-
// specifically asks for them.
101-
let silence_unless_specified = |filter: tracing_subscriber::EnvFilter, target| {
102-
if !log_env.as_ref().map_or(false, |s| {
103-
s.split(',').any(|directive| directive.starts_with(target))
104-
}) {
105-
filter.add_directive(format!("{target}=warn").parse().unwrap())
106-
} else {
107-
filter
108-
}
109-
};
110-
let filter = silence_unless_specified(filter, "handlebars");
111-
let filter = silence_unless_specified(filter, "html5ever");
112-
113-
// Don't show the target by default, since it generally isn't useful
114-
// unless you are overriding the level.
115-
let with_target = log_env.is_ok();
116-
117-
tracing_subscriber::fmt()
118-
.without_time()
119-
.with_ansi(std::io::IsTerminal::is_terminal(&std::io::stderr()))
120-
.with_writer(std::io::stderr)
121-
.with_env_filter(filter)
122-
.with_target(with_target)
123-
.init();
124-
}
125-
12693
fn get_book_dir(args: &ArgMatches) -> PathBuf {
12794
if let Some(p) = args.get_one::<PathBuf>("dir") {
12895
// Check if path is relative from current dir, or absolute...

0 commit comments

Comments
 (0)