@@ -150,18 +150,48 @@ impl SimpleLogger {
150150 /// [`with_level`] if `RUST_LOG` is not set or can't be parsed as a
151151 /// standard log level.
152152 ///
153+ /// module/target level filtering is supported
154+ ///
155+ /// the following format is expected:
156+ /// ```text
157+ /// RUST_LOG=[default-level][,][target][=][level][,...]
158+ /// ```
159+ /// example:
160+ /// ```text
161+ /// RUST_LOG=warn,data=debug,hardware=debug
162+ /// ```
163+ ///
153164 /// This must be called after [`with_level`]. If called before
154165 /// [`with_level`], it will have no effect.
155166 ///
156167 /// [`with_level`]: #method.with_level
157168 #[ must_use = "You must call init() to begin logging" ]
158169 pub fn env ( mut self ) -> SimpleLogger {
159- self . default_level = std:: env:: var ( "RUST_LOG" )
160- . ok ( )
161- . as_deref ( )
162- . map ( log:: LevelFilter :: from_str)
163- . and_then ( Result :: ok)
164- . unwrap_or ( self . default_level ) ;
170+ if let Ok ( modules) = std:: env:: var ( "RUST_LOG" ) . as_deref ( ) {
171+ let mut iter = modules. split ( ',' ) ;
172+
173+ if let Some ( ( module, level) ) = iter
174+ . next ( )
175+ . map ( |pair| match log:: LevelFilter :: from_str ( pair) {
176+ Ok ( level) => {
177+ self . default_level = level;
178+ None
179+ }
180+ Err ( _) => Some ( pair) ,
181+ } )
182+ . and_then ( |x| x)
183+ . map ( |pair| pair. split_once ( '=' ) )
184+ . and_then ( |x| x)
185+ {
186+ let level = log:: LevelFilter :: from_str ( level) . unwrap_or ( self . default_level ) ;
187+ self . module_levels . push ( ( module. to_string ( ) , level) ) ;
188+ }
189+
190+ for ( module, level) in iter. flat_map ( |x| x. split_once ( '=' ) ) {
191+ let level = log:: LevelFilter :: from_str ( level) . unwrap_or ( self . default_level ) ;
192+ self . module_levels . push ( ( module. to_string ( ) , level) ) ;
193+ }
194+ }
165195
166196 self
167197 }
0 commit comments