This commit is contained in:
Mateusz Gruszczyński committed 2026-10-09 17:09:41 +02:00
1 parent 3e33982cd3
commit ad95bfb050
27 files changed
+309 -80

No files matched your search

+18 -2
View File
@@ -328,6 +328,7 @@ pub struct ErrorLogStats {
#[derive(Debug)]
struct ErrorEvent {
timestamp: String,
level: String,
target: String,
message: String,
fields: BTreeMap<String, String>,
@@ -369,9 +370,23 @@ impl ErrorLogController {
self.settings.store(Arc::new(settings));
self.settings_changed.send_replace(());
}
/// All diagnostics go to stderr when file logging is disabled. With a file
/// configured, warnings/errors go only to that file (unless the sink fails).
/// Informational startup messages remain on the console.
pub fn console_enabled_for(&self, level: &Level) -> bool {
!matches!(*level, Level::WARN | Level::ERROR) || !self.settings.load().enabled
}
fn push(&self, event: ErrorEvent) {
if self.settings.load().enabled && self.sender.try_send(event).is_err() {
let config = self.settings.load();
if !config.enabled {
return;
}
if let Err(error) = self.sender.try_send(event) {
self.dropped.fetch_add(1, Ordering::Relaxed);
// An overloaded/closed sink must not silently swallow a diagnostic
// suppressed by the console filter. This emergency path is bounded
// to one event and only runs on a failed non-blocking enqueue.
write_error_fallback(&error.into_inner(), config.format);
}
}
pub fn stats(&self) -> ErrorLogStats {
@@ -451,7 +466,7 @@ impl tracing::field::Visit for EventVisitor {
}
impl<S: Subscriber> Layer<S> for ErrorLogLayer {
fn on_event(&self, event: &Event<'_>, _ctx: LayerContext<'_, S>) {
if *event.metadata().level() != Level::ERROR {
if !matches!(*event.metadata().level(), Level::ERROR | Level::WARN) {
return;
}
let mut visitor = EventVisitor::default();
@@ -466,6 +481,7 @@ impl<S: Subscriber> Layer<S> for ErrorLogLayer {
}
self.controller.push(ErrorEvent {
timestamp: rfc3339_now(),
level: event.metadata().level().as_str().to_owned(),
target: event.metadata().target().to_owned(),
message: redact_text(visitor.message.as_deref().unwrap_or("error")),
fields,