diff --git a/arch/supervisord.conf b/arch/supervisord.conf index 315f68aa..d4d99494 100644 --- a/arch/supervisord.conf +++ b/arch/supervisord.conf @@ -2,21 +2,21 @@ nodaemon=true [program:brightstaff] -command=sh -c "RUST_LOG=info /app/brightstaff 2>&1 | tee /var/log/brightstaff.log" +command=sh -c "RUST_LOG=info /app/brightstaff 2>&1 | tee /var/log/brightstaff.log | while IFS= read -r line; do echo '[brightstaff]' \"$line\"; done" stdout_logfile=/dev/stdout redirect_stderr=true stdout_logfile_maxbytes=0 stderr_logfile_maxbytes=0 [program:envoy] -command=/bin/sh -c "python /app/config_generator.py && envsubst < /etc/envoy/envoy.yaml > /etc/envoy.env_sub.yaml && envoy -c /etc/envoy.env_sub.yaml --component-log-level wasm:info --log-format '[%%Y-%%m-%%d %%T.%%e][%%l] %%v' 2>&1 | tee /var/log/envoy.log" +command=/bin/sh -c "python /app/config_generator.py && envsubst < /etc/envoy/envoy.yaml > /etc/envoy.env_sub.yaml && envoy -c /etc/envoy.env_sub.yaml --component-log-level wasm:info --log-format '[%%Y-%%m-%%d %%T.%%e][%%l] %%v' 2>&1 | tee /var/log/envoy.log | while IFS= read -r line; do echo '[envoy_logs] ' \"$line\"; done" stdout_logfile=/dev/stdout redirect_stderr=true stdout_logfile_maxbytes=0 stderr_logfile_maxbytes=0 [program:tail_access_logs] -command=/bin/sh -c "tail -F /var/log/access_*.log" +command=/bin/sh -c "tail -F /var/log/access_*.log | while IFS= read -r line; do echo '[access_logs]' \"$line\"; done" stdout_logfile=/dev/stdout redirect_stderr=true stdout_logfile_maxbytes=0 diff --git a/crates/Cargo.lock b/crates/Cargo.lock index 1f33b4c2..51783a15 100644 --- a/crates/Cargo.lock +++ b/crates/Cargo.lock @@ -228,6 +228,7 @@ dependencies = [ "serde_with", "serde_yaml", "thiserror 2.0.12", + "time", "tokio", "tokio-stream", "tracing", @@ -3419,6 +3420,7 @@ dependencies = [ "sharded-slab", "smallvec", "thread_local", + "time", "tracing", "tracing-core", "tracing-log", diff --git a/crates/brightstaff/Cargo.toml b/crates/brightstaff/Cargo.toml index 23f3e8b1..5cea1327 100644 --- a/crates/brightstaff/Cargo.toml +++ b/crates/brightstaff/Cargo.toml @@ -29,6 +29,7 @@ serde_yaml = "0.9.34" thiserror = "2.0.12" tokio = { version = "1.44.2", features = ["full"] } tokio-stream = "0.1.17" +time = { version = "0.3", features = ["formatting", "macros"] } tracing = "0.1.41" tracing-opentelemetry = "0.30.0" -tracing-subscriber = { version = "0.3.19", features = ["env-filter", "fmt"] } +tracing-subscriber = { version = "0.3.19", features = ["env-filter", "fmt", "time"] } diff --git a/crates/brightstaff/src/utils/tracing.rs b/crates/brightstaff/src/utils/tracing.rs index 5b577b0a..7acb249a 100644 --- a/crates/brightstaff/src/utils/tracing.rs +++ b/crates/brightstaff/src/utils/tracing.rs @@ -1,9 +1,46 @@ use std::sync::OnceLock; +use std::fmt; use opentelemetry::global; use opentelemetry_sdk::{propagation::TraceContextPropagator, trace::SdkTracerProvider}; use opentelemetry_stdout::SpanExporter; use tracing_subscriber::EnvFilter; +use tracing_subscriber::fmt::{format, time::FormatTime, FmtContext, FormatEvent, FormatFields}; +use tracing::{Event, Subscriber}; +use time::macros::format_description; + +struct BracketedTime; + +impl FormatTime for BracketedTime { + fn format_time(&self, w: &mut format::Writer<'_>) -> fmt::Result { + let now = time::OffsetDateTime::now_utc(); + write!(w, "[{}]", now.format(&format_description!("[year]-[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]")).unwrap()) + } +} + +struct BracketedFormatter; + +impl FormatEvent for BracketedFormatter +where + S: Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>, + N: for<'a> FormatFields<'a> + 'static, +{ + fn format_event( + &self, + ctx: &FmtContext<'_, S, N>, + mut writer: format::Writer<'_>, + event: &Event<'_>, + ) -> fmt::Result { + let timer = BracketedTime; + timer.format_time(&mut writer)?; + + write!(writer, "[{}] ", event.metadata().level().to_string().to_lowercase())?; + + ctx.field_format().format_fields(writer.by_ref(), event)?; + + writeln!(writer) + } +} static INIT_LOGGER: OnceLock = OnceLock::new(); @@ -22,6 +59,7 @@ pub fn init_tracer() -> &'static SdkTracerProvider { .with_env_filter( EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")), ) + .event_format(BracketedFormatter) .init(); provider