14
14
//!
15
15
//! ```
16
16
//! fn main() {
17
- //! rustc_log::init_env_logger( "LOG").unwrap();
17
+ //! rustc_log::init_logger(rustc_log::LoggerConfig::from_env( "LOG") ).unwrap();
18
18
//!
19
19
//! let edition = rustc_span::edition::Edition::Edition2021;
20
20
//! rustc_span::create_session_globals_then(edition, || {
@@ -52,13 +52,36 @@ use tracing_subscriber::fmt::{
52
52
} ;
53
53
use tracing_subscriber:: layer:: SubscriberExt ;
54
54
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 {
57
80
Ok ( env) => EnvFilter :: new ( env) ,
58
81
_ => EnvFilter :: default ( ) . add_directive ( Directive :: from ( LevelFilter :: WARN ) ) ,
59
82
} ;
60
83
61
- let color_logs = match env :: var ( String :: from ( env ) + "_COLOR" ) {
84
+ let color_logs = match cfg . color_logs {
62
85
Ok ( value) => match value. as_ref ( ) {
63
86
"always" => true ,
64
87
"never" => false ,
@@ -69,14 +92,14 @@ pub fn init_env_logger(env: &str) -> Result<(), Error> {
69
92
Err ( VarError :: NotUnicode ( _value) ) => return Err ( Error :: NonUnicodeColorValue ) ,
70
93
} ;
71
94
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 ,
75
98
} ;
76
99
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 ,
80
103
} ;
81
104
82
105
let layer = tracing_tree:: HierarchicalLayer :: default ( )
@@ -91,7 +114,7 @@ pub fn init_env_logger(env: &str) -> Result<(), Error> {
91
114
. with_thread_names ( verbose_thread_ids) ;
92
115
93
116
let subscriber = tracing_subscriber:: Registry :: default ( ) . with ( filter) . with ( layer) ;
94
- match env :: var ( format ! ( "{env}_BACKTRACE" ) ) {
117
+ match cfg . backtrace {
95
118
Ok ( str) => {
96
119
let fmt_layer = tracing_subscriber:: fmt:: layer ( )
97
120
. with_writer ( io:: stderr)
0 commit comments