Allow initializing logger with additional tracing Layer

This commit is contained in:
Stypox 2025-05-12 16:27:09 +02:00
parent 2b0274c71d
commit 0d74252537
No known key found for this signature in database
GPG key ID: 4BDF1B40A49FDD23
2 changed files with 26 additions and 3 deletions

View file

@ -1507,6 +1507,17 @@ pub fn init_logger(early_dcx: &EarlyDiagCtxt, cfg: rustc_log::LoggerConfig) {
}
}
pub fn init_logger_with_additional_layer(
early_dcx: &EarlyDiagCtxt,
cfg: rustc_log::LoggerConfig,
additional_tracing_layer: impl rustc_log::Layer<rustc_log::Registry> + Send + Sync,
) {
if let Err(error) = rustc_log::init_logger_with_additional_layer(cfg, additional_tracing_layer)
{
early_dcx.early_fatal(error.to_string());
}
}
/// Install our usual `ctrlc` handler, which sets [`rustc_const_eval::CTRL_C_RECEIVED`].
/// Making this handler optional lets tools can install a different handler, if they wish.
pub fn install_ctrlc_handler() {

View file

@ -42,7 +42,9 @@ use tracing_core::{Event, Subscriber};
use tracing_subscriber::filter::{Directive, EnvFilter, LevelFilter};
use tracing_subscriber::fmt::FmtContext;
use tracing_subscriber::fmt::format::{self, FormatEvent, FormatFields};
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::layer::{Identity, SubscriberExt};
// Re-export tracing_subscriber items so rustc_driver_impl doesn't need to depend on it.
pub use tracing_subscriber::{Layer, Registry};
/// The values of all the environment variables that matter for configuring a logger.
/// Errors are explicitly preserved so that we can share error handling.
@ -72,6 +74,15 @@ impl LoggerConfig {
/// Initialize the logger with the given values for the filter, coloring, and other options env variables.
pub fn init_logger(cfg: LoggerConfig) -> Result<(), Error> {
init_logger_with_additional_layer(cfg, Identity::new())
}
/// Initialize the logger with the given values for the filter, coloring, and other options env variables.
/// Additionally add a custom layer to collect logging and tracing events.
pub fn init_logger_with_additional_layer(
cfg: LoggerConfig,
additional_tracing_layer: impl Layer<Registry> + Send + Sync,
) -> Result<(), Error> {
let filter = match cfg.filter {
Ok(env) => EnvFilter::new(env),
_ => EnvFilter::default().add_directive(Directive::from(LevelFilter::WARN)),
@ -104,7 +115,7 @@ pub fn init_logger(cfg: LoggerConfig) -> Result<(), Error> {
};
let mut layer = tracing_tree::HierarchicalLayer::default()
.with_writer(io::stderr)
.with_writer(io::stderr as fn() -> io::Stderr)
.with_ansi(color_logs)
.with_targets(true)
.with_verbose_exit(verbose_entry_exit)
@ -124,7 +135,8 @@ pub fn init_logger(cfg: LoggerConfig) -> Result<(), Error> {
Err(_) => {} // no wraptree
}
let subscriber = tracing_subscriber::Registry::default().with(filter).with(layer);
let subscriber =
Registry::default().with(additional_tracing_layer).with(layer.with_filter(filter));
match cfg.backtrace {
Ok(backtrace_target) => {
let fmt_layer = tracing_subscriber::fmt::layer()