1414//!
1515//! ```
1616//! fn main() {
17- //! rustc_log::init_env_logger( "LOG").unwrap();
17+ //! rustc_log::init_logger(rustc_log::LoggerConfig::from_env( "LOG") ).unwrap();
1818//!
1919//! let edition = rustc_span::edition::Edition::Edition2021;
2020//! rustc_span::create_session_globals_then(edition, || {
@@ -52,13 +52,36 @@ use tracing_subscriber::fmt::{
5252} ;
5353use tracing_subscriber:: layer:: SubscriberExt ;
5454
55- pub fn init_env_logger ( env : & str ) -> Result < ( ) , Error > {
56- let filter = match env:: var ( env) {
55+ /// The values of all the environment variables that matter for configuring a logger.
56+ /// Errors are explicitly preserved so that we can share error handling.
57+ pub struct LoggerConfig {
58+ pub filter : Result < String , VarError > ,
59+ pub color_logs : Result < String , VarError > ,
60+ pub verbose_entry_exit : Result < String , VarError > ,
61+ pub verbose_thread_ids : Result < String , VarError > ,
62+ pub backtrace : Result < String , VarError > ,
63+ }
64+
65+ impl LoggerConfig {
66+ pub fn from_env ( env : & str ) -> Self {
67+ LoggerConfig {
68+ filter : env:: var ( env) ,
69+ color_logs : env:: var ( format ! ( "{env}_COLOR" ) ) ,
70+ verbose_entry_exit : env:: var ( format ! ( "{env}_ENTRY_EXIT" ) ) ,
71+ verbose_thread_ids : env:: var ( format ! ( "{env}_THREAD_IDS" ) ) ,
72+ backtrace : env:: var ( format ! ( "{env}_BACKTRACE" ) ) ,
73+ }
74+ }
75+ }
76+
77+ /// Initialize the logger with the given values for the filter, coloring, and other options env variables.
78+ pub fn init_logger ( cfg : LoggerConfig ) -> Result < ( ) , Error > {
79+ let filter = match cfg. filter {
5780 Ok ( env) => EnvFilter :: new ( env) ,
5881 _ => EnvFilter :: default ( ) . add_directive ( Directive :: from ( LevelFilter :: WARN ) ) ,
5982 } ;
6083
61- let color_logs = match env :: var ( String :: from ( env ) + "_COLOR" ) {
84+ let color_logs = match cfg . color_logs {
6285 Ok ( value) => match value. as_ref ( ) {
6386 "always" => true ,
6487 "never" => false ,
@@ -69,14 +92,14 @@ pub fn init_env_logger(env: &str) -> Result<(), Error> {
6992 Err ( VarError :: NotUnicode ( _value) ) => return Err ( Error :: NonUnicodeColorValue ) ,
7093 } ;
7194
72- let verbose_entry_exit = match env :: var_os ( String :: from ( env ) + "_ENTRY_EXIT" ) {
73- None => false ,
74- Some ( v ) => & v != "0" ,
95+ let verbose_entry_exit = match cfg . verbose_entry_exit {
96+ Ok ( v ) => & v != "0" ,
97+ Err ( _ ) => false ,
7598 } ;
7699
77- let verbose_thread_ids = match env :: var_os ( String :: from ( env ) + "_THREAD_IDS" ) {
78- None => false ,
79- Some ( v ) => & v == "1" ,
100+ let verbose_thread_ids = match cfg . verbose_thread_ids {
101+ Ok ( v ) => & v == "1" ,
102+ Err ( _ ) => false ,
80103 } ;
81104
82105 let layer = tracing_tree:: HierarchicalLayer :: default ( )
@@ -91,7 +114,7 @@ pub fn init_env_logger(env: &str) -> Result<(), Error> {
91114 . with_thread_names ( verbose_thread_ids) ;
92115
93116 let subscriber = tracing_subscriber:: Registry :: default ( ) . with ( filter) . with ( layer) ;
94- match env :: var ( format ! ( "{env}_BACKTRACE" ) ) {
117+ match cfg . backtrace {
95118 Ok ( str) => {
96119 let fmt_layer = tracing_subscriber:: fmt:: layer ( )
97120 . with_writer ( io:: stderr)
0 commit comments