@@ -11,13 +11,13 @@ use tokio::runtime::Runtime;
1111use tracing:: subscriber:: Interest ;
1212use tracing:: { Instrument , Metadata , debug_span, metadata:: LevelFilter } ;
1313use tracing_appender:: rolling:: Rotation ;
14+ use tracing_bunyan_formatter:: { BunyanFormattingLayer , JsonStorageLayer } ;
1415use tracing_subscriber:: {
15- Layer ,
1616 layer:: { Context , Filter } ,
1717 prelude:: * ,
1818 registry,
1919} ;
20- use tracing_tree:: HierarchicalLayer ;
20+ use tracing_tree:: { HierarchicalLayer , time :: UtcDateTime } ;
2121
2222pub ( crate ) fn start (
2323 session : CliSession ,
@@ -78,8 +78,10 @@ pub(crate) fn run_server(
7878 config_path : Option < PathBuf > ,
7979 log_path : Option < PathBuf > ,
8080 log_file_name_prefix : Option < String > ,
81+ log_level : Option < String > ,
82+ log_kind : Option < String > ,
8183) -> Result < ( ) , CliDiagnostic > {
82- setup_tracing_subscriber ( log_path, log_file_name_prefix) ;
84+ setup_tracing_subscriber ( log_path, log_file_name_prefix, log_level , log_kind ) ;
8385
8486 let rt = Runtime :: new ( ) ?;
8587 let factory = ServerFactory :: new ( stop_on_disconnect) ;
@@ -181,28 +183,54 @@ async fn start_lsp_proxy(
181183/// is written to log files rotated on a hourly basis (in
182184/// `pgt-logs/server.log.yyyy-MM-dd-HH` files inside the system temporary
183185/// directory)
184- fn setup_tracing_subscriber ( log_path : Option < PathBuf > , log_file_name_prefix : Option < String > ) {
186+ fn setup_tracing_subscriber (
187+ log_path : Option < PathBuf > ,
188+ log_file_name_prefix : Option < String > ,
189+ log_level : Option < String > ,
190+ log_kind : Option < String > ,
191+ ) {
185192 let pgt_log_path = log_path. unwrap_or ( pgt_fs:: ensure_cache_dir ( ) . join ( "pgt-logs" ) ) ;
193+
186194 let appender_builder = tracing_appender:: rolling:: RollingFileAppender :: builder ( ) ;
195+
187196 let file_appender = appender_builder
188197 . filename_prefix ( log_file_name_prefix. unwrap_or ( String :: from ( "server.log" ) ) )
189198 . max_log_files ( 7 )
190199 . rotation ( Rotation :: HOURLY )
191200 . build ( pgt_log_path)
192201 . expect ( "Failed to start the logger for the daemon." ) ;
193202
194- registry ( )
195- . with (
196- HierarchicalLayer :: default ( )
197- . with_indent_lines ( true )
198- . with_indent_amount ( 2 )
199- . with_bracketed_fields ( true )
200- . with_targets ( true )
201- . with_ansi ( false )
202- . with_writer ( file_appender)
203- . with_filter ( LoggingFilter ) ,
204- )
205- . init ( ) ;
203+ let filter = PgtLoggingFilter :: from ( log_level) ;
204+
205+ let log_kind = log_kind. unwrap_or ( "hierarchical" . into ( ) ) ;
206+
207+ match log_kind. as_str ( ) {
208+ "bunyan" => {
209+ registry ( )
210+ . with ( JsonStorageLayer )
211+ . with (
212+ BunyanFormattingLayer :: new ( "pgt_logs" . into ( ) , file_appender)
213+ . with_filter ( filter) ,
214+ )
215+ . init ( ) ;
216+ }
217+
218+ _ => registry ( )
219+ . with (
220+ HierarchicalLayer :: default ( )
221+ . with_indent_lines ( true )
222+ . with_indent_amount ( 2 )
223+ . with_bracketed_fields ( true )
224+ . with_targets ( true )
225+ . with_ansi ( false )
226+ . with_timer ( UtcDateTime {
227+ higher_precision : false ,
228+ } )
229+ . with_writer ( file_appender)
230+ . with_filter ( filter) ,
231+ )
232+ . init ( ) ,
233+ }
206234}
207235
208236pub fn default_pgt_log_path ( ) -> PathBuf {
@@ -212,22 +240,34 @@ pub fn default_pgt_log_path() -> PathBuf {
212240 }
213241}
214242
215- /// Tracing filter enabling :
216- /// - All spans and events at level info or higher
217- /// - All spans and events at level debug in crates whose name starts with `pgt`
218- struct LoggingFilter ;
243+ /// Tracing Filter with two rules :
244+ /// For all crates starting with pgt*, use `PGT_LOG_LEVEL` or CLI option or "info" as default
245+ /// For all other crates, use "info"
246+ struct PgtLoggingFilter ( LevelFilter ) ;
219247
220- /// Tracing filter used for spans emitted by `pgt*` crates
221- const SELF_FILTER : LevelFilter = if cfg ! ( debug_assertions) {
222- LevelFilter :: TRACE
223- } else {
224- LevelFilter :: DEBUG
225- } ;
248+ impl From < Option < String > > for PgtLoggingFilter {
249+ fn from ( value : Option < String > ) -> Self {
250+ Self (
251+ value
252+ . map ( |lv_filter| match lv_filter. as_str ( ) {
253+ "trace" => LevelFilter :: TRACE ,
254+ "debug" => LevelFilter :: DEBUG ,
255+ "info" => LevelFilter :: INFO ,
256+ "warn" => LevelFilter :: WARN ,
257+ "error" => LevelFilter :: ERROR ,
258+ "off" => LevelFilter :: OFF ,
259+
260+ _ => LevelFilter :: INFO ,
261+ } )
262+ . unwrap_or ( LevelFilter :: INFO ) ,
263+ )
264+ }
265+ }
226266
227- impl LoggingFilter {
267+ impl PgtLoggingFilter {
228268 fn is_enabled ( & self , meta : & Metadata < ' _ > ) -> bool {
229269 let filter = if meta. target ( ) . starts_with ( "pgt" ) {
230- SELF_FILTER
270+ self . 0
231271 } else {
232272 LevelFilter :: INFO
233273 } ;
@@ -236,7 +276,7 @@ impl LoggingFilter {
236276 }
237277}
238278
239- impl < S > Filter < S > for LoggingFilter {
279+ impl < S > Filter < S > for PgtLoggingFilter {
240280 fn enabled ( & self , meta : & Metadata < ' _ > , _cx : & Context < ' _ , S > ) -> bool {
241281 self . is_enabled ( meta)
242282 }
@@ -250,6 +290,6 @@ impl<S> Filter<S> for LoggingFilter {
250290 }
251291
252292 fn max_level_hint ( & self ) -> Option < LevelFilter > {
253- Some ( SELF_FILTER )
293+ Some ( self . 0 )
254294 }
255295}
0 commit comments