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