Log config provenance in debug.

This helps identify configuration issues by printing the source of every
configuration value used by Rocket.
This commit is contained in:
Sergio Benitez 2023-05-04 18:27:44 -07:00
parent 817648cef5
commit 07c23a4b2d
1 changed files with 50 additions and 12 deletions

View File

@ -6,6 +6,7 @@ use figment::value::{Map, Dict, magic::RelativePathBuf};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use yansi::Paint; use yansi::Paint;
use crate::log::PaintExt;
use crate::config::{LogLevel, Shutdown, Ident}; use crate::config::{LogLevel, Shutdown, Ident};
use crate::request::{self, Request, FromRequest}; use crate::request::{self, Request, FromRequest};
use crate::http::uncased::Uncased; use crate::http::uncased::Uncased;
@ -376,13 +377,31 @@ impl Config {
}) })
} }
pub(crate) fn pretty_print(&self, figment: &Figment) { #[inline]
use crate::log::PaintExt; pub(crate) fn trace_print(&self, figment: &Figment) {
if self.log_level != LogLevel::Debug {
return;
}
trace!("-- configuration trace information --");
for param in Self::PARAMETERS {
if let Some(meta) = figment.find_metadata(param) {
let (param, name) = (Paint::blue(param), Paint::white(&meta.name));
if let Some(ref source) = meta.source {
trace_!("{:?} parameter source: {} ({})", param, name, source);
} else {
trace_!("{:?} parameter source: {}", param, name);
}
}
}
}
pub(crate) fn pretty_print(&self, figment: &Figment) {
fn bold<T: std::fmt::Display>(val: T) -> Paint<T> { fn bold<T: std::fmt::Display>(val: T) -> Paint<T> {
Paint::default(val).bold() Paint::default(val).bold()
} }
self.trace_print(figment);
launch_meta!("{}Configured for {}.", Paint::emoji("🔧 "), self.profile); launch_meta!("{}Configured for {}.", Paint::emoji("🔧 "), self.profile);
launch_meta_!("address: {}", bold(&self.address)); launch_meta_!("address: {}", bold(&self.address));
launch_meta_!("port: {}", bold(&self.port)); launch_meta_!("port: {}", bold(&self.port));
@ -410,15 +429,6 @@ impl Config {
(false, _) => launch_meta_!("tls: {}", bold("disabled")), (false, _) => launch_meta_!("tls: {}", bold("disabled")),
} }
#[cfg(feature = "secrets")] {
launch_meta_!("secret key: {}", bold(&self.secret_key));
if !self.secret_key.is_provided() {
warn!("secrets enabled without a stable `secret_key`");
launch_meta_!("disable `secrets` feature or configure a `secret_key`");
launch_meta_!("this becomes an {} in non-debug profiles", Paint::red("error"));
}
}
launch_meta_!("shutdown: {}", bold(&self.shutdown)); launch_meta_!("shutdown: {}", bold(&self.shutdown));
launch_meta_!("log level: {}", bold(self.log_level)); launch_meta_!("log level: {}", bold(self.log_level));
launch_meta_!("cli colors: {}", bold(&self.cli_colors)); launch_meta_!("cli colors: {}", bold(&self.cli_colors));
@ -451,6 +461,15 @@ impl Config {
} }
} }
} }
#[cfg(feature = "secrets")] {
launch_meta_!("secret key: {}", bold(&self.secret_key));
if !self.secret_key.is_provided() {
warn!("secrets enabled without a stable `secret_key`");
launch_meta_!("disable `secrets` feature or configure a `secret_key`");
launch_meta_!("this becomes an {} in non-debug profiles", Paint::red("error"));
}
}
} }
} }
@ -493,6 +512,12 @@ impl Config {
/// The stringy parameter name for setting/extracting [`Config::keep_alive`]. /// The stringy parameter name for setting/extracting [`Config::keep_alive`].
pub const KEEP_ALIVE: &'static str = "keep_alive"; pub const KEEP_ALIVE: &'static str = "keep_alive";
/// The stringy parameter name for setting/extracting [`Config::ident`].
pub const IDENT: &'static str = "ident";
/// The stringy parameter name for setting/extracting [`Config::ip_header`].
pub const IP_HEADER: &'static str = "ip_header";
/// The stringy parameter name for setting/extracting [`Config::limits`]. /// The stringy parameter name for setting/extracting [`Config::limits`].
pub const LIMITS: &'static str = "limits"; pub const LIMITS: &'static str = "limits";
@ -513,11 +538,24 @@ impl Config {
/// The stringy parameter name for setting/extracting [`Config::cli_colors`]. /// The stringy parameter name for setting/extracting [`Config::cli_colors`].
pub const CLI_COLORS: &'static str = "cli_colors"; pub const CLI_COLORS: &'static str = "cli_colors";
/// An array of all of the stringy parameter names.
pub const PARAMETERS: &'static [&'static str] = &[
Self::ADDRESS, Self::PORT, Self::WORKERS, Self::MAX_BLOCKING,
Self::KEEP_ALIVE, Self::IDENT, Self::IP_HEADER, Self::LIMITS, Self::TLS,
Self::SECRET_KEY, Self::TEMP_DIR, Self::LOG_LEVEL, Self::SHUTDOWN,
Self::CLI_COLORS,
];
} }
impl Provider for Config { impl Provider for Config {
#[track_caller]
fn metadata(&self) -> Metadata { fn metadata(&self) -> Metadata {
Metadata::named("Rocket Config") if self == &Config::default() {
Metadata::named("rocket::Config::default()")
} else {
Metadata::named("rocket::Config")
}
} }
#[track_caller] #[track_caller]