Improved tracing (part 1)
This commit is contained in:
@@ -12,7 +12,6 @@ rustls-pki-types = { version = "1" }
|
||||
tokio = { version = "1.23", features = ["net", "macros"] }
|
||||
tokio-rustls = { version = "0.26", default-features = false, features = ["ring", "tls12"] }
|
||||
serde = { version = "1.0", features = ["derive"]}
|
||||
tracing = "0.1"
|
||||
mail-auth = { version = "0.4" }
|
||||
smtp-proto = { version = "0.1" }
|
||||
mail-send = { version = "0.4", default-features = false, features = ["cram-md5", "ring", "tls12"] }
|
||||
|
||||
@@ -173,19 +173,22 @@ impl Config {
|
||||
|
||||
pub fn log_errors(&self, use_stderr: bool) {
|
||||
for (key, err) in &self.errors {
|
||||
let message = match err {
|
||||
ConfigError::Parse { error } => {
|
||||
format!("Failed to parse setting {key:?}: {error}")
|
||||
}
|
||||
ConfigError::Build { error } => {
|
||||
format!("Build error for key {key:?}: {error}")
|
||||
}
|
||||
ConfigError::Macro { error } => {
|
||||
format!("Macro expansion error for setting {key:?}: {error}")
|
||||
}
|
||||
let (cause, message) = match err {
|
||||
ConfigError::Parse { error } => (
|
||||
trc::ConfigEvent::ParseError,
|
||||
format!("Failed to parse setting {key:?}: {error}"),
|
||||
),
|
||||
ConfigError::Build { error } => (
|
||||
trc::ConfigEvent::BuildError,
|
||||
format!("Build error for key {key:?}: {error}"),
|
||||
),
|
||||
ConfigError::Macro { error } => (
|
||||
trc::ConfigEvent::MacroError,
|
||||
format!("Macro expansion error for setting {key:?}: {error}"),
|
||||
),
|
||||
};
|
||||
if !use_stderr {
|
||||
tracing::error!("{}", message);
|
||||
trc::event!(Config(cause), Details = message);
|
||||
} else {
|
||||
eprintln!("ERROR: {message}");
|
||||
}
|
||||
@@ -197,23 +200,30 @@ impl Config {
|
||||
self.warn_unread_keys();
|
||||
|
||||
for (key, warn) in &self.warnings {
|
||||
let message = match warn {
|
||||
ConfigWarning::AppliedDefault { default } => {
|
||||
format!("WARNING: Missing setting {key:?}, applied default {default:?}")
|
||||
}
|
||||
ConfigWarning::Missing => {
|
||||
format!("WARNING: Missing setting {key:?}")
|
||||
}
|
||||
ConfigWarning::Unread { value } => {
|
||||
format!("WARNING: Unused setting {key:?} with value {value:?}")
|
||||
}
|
||||
ConfigWarning::Parse { error } => {
|
||||
format!("WARNING: Failed to parse {key:?}: {error}")
|
||||
}
|
||||
ConfigWarning::Build { error } => format!("WARNING for {key:?}: {error}"),
|
||||
let (cause, message) = match warn {
|
||||
ConfigWarning::AppliedDefault { default } => (
|
||||
trc::ConfigEvent::DefaultApplied,
|
||||
format!("WARNING: Missing setting {key:?}, applied default {default:?}"),
|
||||
),
|
||||
ConfigWarning::Missing => (
|
||||
trc::ConfigEvent::MissingSetting,
|
||||
format!("WARNING: Missing setting {key:?}"),
|
||||
),
|
||||
ConfigWarning::Unread { value } => (
|
||||
trc::ConfigEvent::UnusedSetting,
|
||||
format!("WARNING: Unused setting {key:?} with value {value:?}"),
|
||||
),
|
||||
ConfigWarning::Parse { error } => (
|
||||
trc::ConfigEvent::ParseWarning,
|
||||
format!("WARNING: Failed to parse {key:?}: {error}"),
|
||||
),
|
||||
ConfigWarning::Build { error } => (
|
||||
trc::ConfigEvent::BuildWarning,
|
||||
format!("WARNING for {key:?}: {error}"),
|
||||
),
|
||||
};
|
||||
if !use_stderr {
|
||||
tracing::debug!("{}", message);
|
||||
trc::event!(Config(cause), Details = message);
|
||||
} else {
|
||||
eprintln!("{}", message);
|
||||
}
|
||||
|
||||
@@ -91,7 +91,10 @@ impl<T> UnwrapFailure<T> for Option<T> {
|
||||
match self {
|
||||
Some(result) => result,
|
||||
None => {
|
||||
tracing::error!("{message}");
|
||||
trc::event!(
|
||||
Server(trc::ServerEvent::StartupError),
|
||||
Details = message.to_string()
|
||||
);
|
||||
eprintln!("{message}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
@@ -104,7 +107,11 @@ impl<T, E: std::fmt::Display> UnwrapFailure<T> for Result<T, E> {
|
||||
match self {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
tracing::error!("{message}: {err}");
|
||||
trc::event!(
|
||||
Server(trc::ServerEvent::StartupError),
|
||||
Details = message.to_string(),
|
||||
Reason = err.to_string()
|
||||
);
|
||||
|
||||
#[cfg(feature = "test_mode")]
|
||||
panic!("{message}: {err}");
|
||||
@@ -120,36 +127,48 @@ impl<T, E: std::fmt::Display> UnwrapFailure<T> for Result<T, E> {
|
||||
}
|
||||
|
||||
pub fn failed(message: &str) -> ! {
|
||||
tracing::error!("{message}");
|
||||
trc::event!(
|
||||
Server(trc::ServerEvent::StartupError),
|
||||
Details = message.to_string(),
|
||||
);
|
||||
eprintln!("{message}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
pub async fn wait_for_shutdown(message: &str) {
|
||||
#[cfg(not(target_env = "msvc"))]
|
||||
{
|
||||
let signal = {
|
||||
use tokio::signal::unix::{signal, SignalKind};
|
||||
|
||||
let mut h_term = signal(SignalKind::terminate()).failed("start signal handler");
|
||||
let mut h_int = signal(SignalKind::interrupt()).failed("start signal handler");
|
||||
|
||||
tokio::select! {
|
||||
_ = h_term.recv() => tracing::debug!("Received SIGTERM."),
|
||||
_ = h_int.recv() => tracing::debug!("Received SIGINT."),
|
||||
};
|
||||
}
|
||||
_ = h_term.recv() => "SIGTERM",
|
||||
_ = h_int.recv() => "SIGINT",
|
||||
}
|
||||
};
|
||||
|
||||
#[cfg(target_env = "msvc")]
|
||||
{
|
||||
let signal = {
|
||||
match tokio::signal::ctrl_c().await {
|
||||
Ok(()) => {}
|
||||
Ok(()) => "SIGINT",
|
||||
Err(err) => {
|
||||
eprintln!("Unable to listen for shutdown signal: {}", err);
|
||||
trc::event!(
|
||||
Server(trc::ServerEvent::Error),
|
||||
Details = "Unable to listen for shutdown signal",
|
||||
Reason = err.to_string(),
|
||||
);
|
||||
"Error"
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
tracing::info!(message);
|
||||
trc::event!(
|
||||
Server(trc::ServerEvent::Shutdown),
|
||||
Details = message.to_string(),
|
||||
CausedBy = signal
|
||||
);
|
||||
}
|
||||
|
||||
pub fn rustls_client_config(allow_invalid_certs: bool) -> ClientConfig {
|
||||
|
||||
Reference in New Issue
Block a user