@@ -6,6 +6,8 @@ use anstyle::AnsiColor;
66use hermit_sync:: OnceCell ;
77use log:: { Level , LevelFilter , Metadata , Record } ;
88
9+ use crate :: env;
10+
911pub static KERNEL_LOGGER : KernelLogger = KernelLogger :: new ( ) ;
1012const ARENA_SIZE : usize = 4096 ;
1113static mut ARENA : [ u8 ; ARENA_SIZE ] = [ 0 ; _] ;
@@ -115,31 +117,38 @@ fn no_color() -> bool {
115117}
116118
117119pub unsafe fn init ( ) {
120+ log:: set_logger ( & KERNEL_LOGGER ) . expect ( "Can't initialize logger" ) ;
121+ // To get logs until we determine the actual log level
122+ log:: set_max_level ( LevelFilter :: Info ) ;
123+
118124 #[ cfg( target_os = "none" ) ]
119125 unsafe {
120126 crate :: mm:: ALLOCATOR
121127 . lock ( )
122128 . claim ( ( & raw mut ARENA ) . cast ( ) , ARENA_SIZE )
123129 . unwrap ( )
124130 } ;
131+ env:: init ( ) ;
132+
133+ let mut filter_builder = env_filter:: Builder :: new ( ) ;
134+ // The default. It may get overwritten by the parsed filter if it has a global level.
135+ filter_builder. filter_level ( LevelFilter :: Info ) ;
136+
137+ if let Some ( compile_time_filter) = option_env ! ( "HERMIT_LOG_DEFAULT" ) . or_else ( || {
138+ option_env ! ( "HERMIT_LOG_LEVEL_FILTER" ) . inspect ( |_| {
139+ warn ! ( "HERMIT_LOG_LEVEL_FILTER is deprecated in favor of HERMIT_LOG_DEFAULT" ) ;
140+ } )
141+ } ) {
142+ filter_builder. parse ( compile_time_filter) ;
143+ }
125144
126- log:: set_logger ( & KERNEL_LOGGER ) . expect ( "Can't initialize logger" ) ;
127- // Determines LevelFilter at compile time
128- let log_level: Option < & ' static str > = option_env ! ( "HERMIT_LOG_LEVEL_FILTER" ) ;
129- let max_level = if let Some ( log_level) = log_level {
130- let filter = env_filter:: Builder :: new ( )
131- // The default. It may get overwritten by the parsed filter if it has a global level.
132- . filter_level ( LevelFilter :: Info )
133- . parse ( log_level)
134- . build ( ) ;
135- let max_level = filter. filter ( ) ;
136- KERNEL_LOGGER . filter . set ( filter) . unwrap ( ) ;
137- max_level
138- } else {
139- LevelFilter :: Info
140- } ;
145+ if let Some ( runtime_filter) = env:: var ( "HERMIT_LOG" ) {
146+ filter_builder. parse ( runtime_filter) ;
147+ }
141148
142- log:: set_max_level ( max_level) ;
149+ let filter = filter_builder. build ( ) ;
150+ log:: set_max_level ( filter. filter ( ) ) ;
151+ KERNEL_LOGGER . filter . set ( filter) . unwrap ( ) ;
143152}
144153
145154#[ cfg_attr( target_arch = "riscv64" , allow( unused) ) ]
0 commit comments