@@ -34,7 +34,12 @@ use once_cell::sync::OnceCell;
3434use sentry_tracing:: { EventFilter , SentryLayer } ;
3535use std:: { path:: Path , sync:: Arc } ;
3636use tracing:: { debug, error, info, warn, Level } ;
37- use tracing_subscriber:: EnvFilter ;
37+ use tracing_subscriber:: {
38+ filter:: { LevelFilter , Targets } ,
39+ fmt,
40+ prelude:: * ,
41+ EnvFilter ,
42+ } ;
3843
3944mod background;
4045mod cache;
@@ -67,6 +72,7 @@ pub use env::Environment;
6772const LOG_ENV_VAR : & str = "BLOOP_LOG" ;
6873static LOGGER_INSTALLED : OnceCell < bool > = OnceCell :: new ( ) ;
6974static SENTRY_GUARD : OnceCell < sentry:: ClientInitGuard > = OnceCell :: new ( ) ;
75+ static LOGGER_GUARD : OnceCell < tracing_appender:: non_blocking:: WorkerGuard > = OnceCell :: new ( ) ;
7076
7177/// The global state
7278#[ derive( Clone ) ]
@@ -218,12 +224,12 @@ impl Application {
218224 _ = SENTRY_GUARD . set ( guard) ;
219225 }
220226
221- pub fn install_logging ( ) {
227+ pub fn install_logging ( config : & Configuration ) {
222228 if let Some ( true ) = LOGGER_INSTALLED . get ( ) {
223229 return ;
224230 }
225231
226- if !tracing_subscribe ( ) {
232+ if !tracing_subscribe ( config ) {
227233 warn ! ( "Failed to install tracing_subscriber. There's probably one already..." ) ;
228234 } ;
229235
@@ -239,7 +245,7 @@ impl Application {
239245 }
240246
241247 pub async fn run ( self ) -> Result < ( ) > {
242- Self :: install_logging ( ) ;
248+ Self :: install_logging ( & self . config ) ;
243249
244250 let mut joins = tokio:: task:: JoinSet :: new ( ) ;
245251
@@ -338,25 +344,36 @@ impl FromRef<Application> for axum_extra::extract::cookie::Key {
338344 }
339345}
340346
341- #[ cfg( all( tokio_unstable, feature = "debug" ) ) ]
342- fn tracing_subscribe ( ) -> bool {
343- use tracing_subscriber:: { fmt, prelude:: * } ;
344- let env_filter = fmt:: layer ( ) . with_filter ( EnvFilter :: from_env ( LOG_ENV_VAR ) ) ;
345- tracing_subscriber:: registry ( )
346- . with ( env_filter)
347- . with ( sentry_layer ( ) )
348- . with ( console_subscriber:: spawn ( ) )
349- . try_init ( )
350- . is_ok ( )
351- }
347+ fn tracing_subscribe ( config : & Configuration ) -> bool {
348+ let env_filter_layer = fmt:: layer ( ) . with_filter ( EnvFilter :: from_env ( LOG_ENV_VAR ) ) ;
349+ let sentry_layer = sentry_layer ( ) ;
350+ let log_writer_layer = ( !config. disable_log_write ) . then ( || {
351+ let log_dir = config. index_dir . join ( "logs" ) ;
352+ let file_appender = tracing_appender:: rolling:: daily ( log_dir, "bloop.log" ) ;
353+ let ( non_blocking, guard) = tracing_appender:: non_blocking ( file_appender) ;
354+ _ = LOGGER_GUARD . set ( guard) ;
355+ fmt:: layer ( )
356+ . with_writer ( non_blocking)
357+ . with_ansi ( false )
358+ . with_filter (
359+ Targets :: new ( )
360+ . with_target ( "bleep" , LevelFilter :: DEBUG )
361+ . with_target ( "bleep::indexes::file" , LevelFilter :: WARN )
362+ . with_target ( "bleep::semantic" , LevelFilter :: WARN ) ,
363+ )
364+ } ) ;
365+
366+ #[ cfg( all( tokio_unstable, feature = "debug" ) ) ]
367+ let console_subscriber_layer = Some ( console_subscriber:: spawn ( ) ) ;
368+ #[ cfg( not( all( tokio_unstable, feature = "debug" ) ) ) ]
369+ let console_subscriber_layer: Option < Box < dyn tracing_subscriber:: Layer < _ > + Send + Sync > > =
370+ None ;
352371
353- #[ cfg( not( all( tokio_unstable, feature = "debug" ) ) ) ]
354- fn tracing_subscribe ( ) -> bool {
355- use tracing_subscriber:: { fmt, prelude:: * } ;
356- let env_filter = fmt:: layer ( ) . with_filter ( EnvFilter :: from_env ( LOG_ENV_VAR ) ) ;
357372 tracing_subscriber:: registry ( )
358- . with ( env_filter)
359- . with ( sentry_layer ( ) )
373+ . with ( log_writer_layer)
374+ . with ( env_filter_layer)
375+ . with ( sentry_layer)
376+ . with ( console_subscriber_layer)
360377 . try_init ( )
361378 . is_ok ( )
362379}
0 commit comments