1- use std:: { io:: IsTerminal , str:: FromStr , sync:: Mutex } ;
2-
3- use hive_router_config:: { log:: LogFormat , HiveRouterConfig } ;
1+ use hive_router_config:: {
2+ log:: { LogFormat , LoggingConfig } ,
3+ HiveRouterConfig ,
4+ } ;
45use hive_router_internal:: {
56 http:: normalize_route_path,
67 telemetry:: {
78 build_otel_layer_from_config, build_resource, build_scope,
89 error:: TelemetryError ,
10+ logging:: utils:: { create_ignore_otel_filter, create_targets_filter, DynLayer } ,
911 metrics:: { build_meter_provider_from_config, PrometheusRuntimeConfig } ,
1012 otel:: {
1113 opentelemetry:: {
@@ -25,12 +27,11 @@ use hive_router_internal::{
2527use ntex:: web:: { self } ;
2628use ntex:: web:: { App , HttpResponse , HttpServer } ;
2729use prometheus:: { Encoder , TextEncoder } ;
28- use tracing_subscriber:: { filter:: filter_fn, util:: SubscriberInitExt , Layer } ;
29- use tracing_subscriber:: { fmt:: time:: UtcTime , EnvFilter } ;
30- use tracing_subscriber:: {
31- fmt:: { self } ,
32- layer:: SubscriberExt ,
33- } ;
30+ use std:: { io:: IsTerminal , sync:: Mutex } ;
31+ use tracing_appender:: non_blocking:: WorkerGuard ;
32+ use tracing_subscriber:: Layer ;
33+ use tracing_subscriber:: { fmt:: time:: UtcTime , Registry } ;
34+ use tracing_subscriber:: { layer:: SubscriberExt , util:: SubscriberInitExt } ;
3435
3536pub struct HeaderExtractor < ' a > ( pub & ' a ntex:: http:: HeaderMap ) ;
3637
@@ -62,6 +63,7 @@ pub struct Telemetry {
6263 pub metrics_provider : Option < SdkMeterProvider > ,
6364 pub prometheus : Option < PrometheusRuntime > ,
6465 pub context : TelemetryContext ,
66+ pub logging_writer_guard : tracing_appender:: non_blocking:: WorkerGuard ,
6567}
6668
6769pub enum PrometheusRuntime {
@@ -128,11 +130,16 @@ impl Telemetry {
128130 ( None , None )
129131 } ;
130132
131- let registry = tracing_subscriber:: registry ( ) . with ( otel_layer) ;
132- init_logging ( config, registry) ?;
133+ let ( logging_layer, stdout_guard) = init_logging :: < Registry > ( & config. log ) ;
134+ let registry = tracing_subscriber:: registry ( )
135+ . with ( logging_layer)
136+ . with ( otel_layer) ;
137+
138+ registry. init ( ) ;
133139
134140 let context = TelemetryContext :: from_propagation_config_with_meter (
135141 & config. telemetry . tracing . propagation ,
142+ & config. log ,
136143 metrics_provider
137144 . as_ref ( )
138145 . map ( |provider| provider. meter_with_scope ( scope) ) ,
@@ -145,6 +152,7 @@ impl Telemetry {
145152 metrics_provider,
146153 prometheus,
147154 context,
155+ logging_writer_guard : stdout_guard,
148156 } )
149157 }
150158
@@ -195,6 +203,7 @@ impl Telemetry {
195203 . map ( |setup| setup. provider . meter_with_scope ( scope) ) ;
196204 let context = TelemetryContext :: from_propagation_config_with_meter (
197205 & config. telemetry . tracing . propagation ,
206+ & config. log ,
198207 meter,
199208 ) ;
200209
@@ -368,62 +377,43 @@ async fn metrics_handler(registry: web::types::State<prometheus::Registry>) -> H
368377 build_metrics_response ( & registry)
369378}
370379
371- pub fn init_logging < S > ( config : & HiveRouterConfig , registry : S ) -> Result < ( ) , TelemetryInitError >
380+ pub fn init_logging < S > ( config : & LoggingConfig ) -> ( DynLayer < S > , WorkerGuard )
372381where
373382 S : tracing:: Subscriber
374383 + for < ' span > tracing_subscriber:: registry:: LookupSpan < ' span >
375384 + Send
376385 + Sync ,
377386{
387+ let stdout_stream = std:: io:: stdout ( ) ;
388+ let is_terminal = stdout_stream. is_terminal ( ) ;
389+ let ( stdout_writer, stdout_guard) = tracing_appender:: non_blocking ( stdout_stream) ;
390+ let targets_filter = create_targets_filter ( & config. level , config. log_internals ) ;
391+ let ignore_otel_filter = create_ignore_otel_filter ( ) ;
392+ let stdout_layer = tracing_subscriber:: fmt:: layer ( ) . with_writer ( stdout_writer) ;
378393 let timer = UtcTime :: rfc_3339 ( ) ;
379- let filter = EnvFilter :: from_str ( config. log . env_filter_str ( ) ) ?;
380- let is_terminal = std:: io:: stdout ( ) . is_terminal ( ) ;
381-
382- let events_only = filter_fn ( |m| !m. is_span ( ) ) ;
383-
384- match config. log . format {
385- LogFormat :: PrettyTree => {
386- registry
387- . with (
388- tracing_tree:: HierarchicalLayer :: new ( 2 )
389- . with_ansi ( is_terminal)
390- . with_bracketed_fields ( true )
391- . with_deferred_spans ( false )
392- . with_wraparound ( 25 )
393- . with_indent_lines ( true )
394- . with_timer ( tracing_tree:: time:: Uptime :: default ( ) )
395- . with_thread_names ( false )
396- . with_thread_ids ( false )
397- . with_targets ( false )
398- . with_filter ( events_only) ,
399- )
400- . with ( filter)
401- . init ( ) ;
402- }
403- LogFormat :: Json => {
404- registry
405- . with (
406- fmt:: layer ( )
407- . json ( )
408- . with_timer ( timer)
409- . with_filter ( events_only) ,
410- )
411- . with ( filter)
412- . init ( ) ;
413- }
414- LogFormat :: PrettyCompact => {
415- registry
416- . with (
417- fmt:: layer ( )
418- . compact ( )
419- . with_ansi ( is_terminal)
420- . with_timer ( timer)
421- . with_filter ( events_only) ,
422- )
423- . with ( filter)
424- . init ( ) ;
425- }
394+
395+ let layer = match config. format {
396+ LogFormat :: Json => stdout_layer
397+ . json ( )
398+ . with_timer ( timer)
399+ . with_thread_ids ( false )
400+ . with_target ( true )
401+ . with_ansi ( is_terminal)
402+ . flatten_event ( true )
403+ . with_span_list ( false )
404+ . with_filter ( targets_filter)
405+ . with_filter ( ignore_otel_filter)
406+ . boxed ( ) ,
407+ LogFormat :: Text => stdout_layer
408+ . compact ( )
409+ . with_thread_ids ( false )
410+ . with_timer ( timer)
411+ . with_target ( true )
412+ . with_ansi ( is_terminal)
413+ . with_filter ( targets_filter)
414+ . with_filter ( ignore_otel_filter)
415+ . boxed ( ) ,
426416 } ;
427417
428- Ok ( ( ) )
418+ ( layer , stdout_guard )
429419}
0 commit comments