@@ -35,6 +35,16 @@ define_log_macro!(trace, trace_);
35
35
define_log_macro ! ( launch_info: info, "rocket::launch" , $) ;
36
36
define_log_macro ! ( launch_info_: info, "rocket::launch_" , $) ;
37
37
38
+ // `print!` panics when stdout isn't available, but this macro doesn't.
39
+ // See SergioBenitez/Rocket#2019 and rust-lang/rust#46016 for more.
40
+ macro_rules! write_out {
41
+ ( $( $arg: tt) * ) => ( {
42
+ use std:: io:: { Write , stdout, stderr} ;
43
+
44
+ let _ = write!( stdout( ) , $( $arg) * ) . or_else( |e| write!( stderr( ) , "{}" , e) ) ;
45
+ } )
46
+ }
47
+
38
48
#[ derive( Debug ) ]
39
49
struct RocketLogger ;
40
50
@@ -86,7 +96,7 @@ impl log::Log for RocketLogger {
86
96
// In Rocket, we abuse targets with suffix "_" to indicate indentation.
87
97
let indented = record. target ( ) . ends_with ( '_' ) ;
88
98
if indented {
89
- print ! ( " {} " , Paint :: default ( ">>" ) . bold( ) ) ;
99
+ write_out ! ( " {} " , Paint :: default ( ">>" ) . bold( ) ) ;
90
100
}
91
101
92
102
// Downgrade a physical launch `warn` to logical `info`.
@@ -96,30 +106,30 @@ impl log::Log for RocketLogger {
96
106
97
107
match level {
98
108
log:: Level :: Error if !indented => {
99
- println ! ( "{} {}" ,
100
- Paint :: red( "Error:" ) . bold( ) ,
101
- Paint :: red( record. args( ) ) . wrap( ) )
109
+ write_out ! ( "{} {}\n " ,
110
+ Paint :: red( "Error:" ) . bold( ) ,
111
+ Paint :: red( record. args( ) ) . wrap( ) ) ;
102
112
}
103
113
log:: Level :: Warn if !indented => {
104
- println ! ( "{} {}" ,
105
- Paint :: yellow( "Warning:" ) . bold( ) ,
106
- Paint :: yellow( record. args( ) ) . wrap( ) )
114
+ write_out ! ( "{} {}\n " ,
115
+ Paint :: yellow( "Warning:" ) . bold( ) ,
116
+ Paint :: yellow( record. args( ) ) . wrap( ) ) ;
107
117
}
108
- log:: Level :: Info => println ! ( "{}" , Paint :: blue( record. args( ) ) . wrap( ) ) ,
109
- log:: Level :: Trace => println ! ( "{}" , Paint :: magenta( record. args( ) ) . wrap( ) ) ,
110
- log:: Level :: Warn => println ! ( "{}" , Paint :: yellow( record. args( ) ) . wrap( ) ) ,
111
- log:: Level :: Error => println ! ( "{}" , Paint :: red( record. args( ) ) . wrap( ) ) ,
118
+ log:: Level :: Info => write_out ! ( "{}\n " , Paint :: blue( record. args( ) ) . wrap( ) ) ,
119
+ log:: Level :: Trace => write_out ! ( "{}\n " , Paint :: magenta( record. args( ) ) . wrap( ) ) ,
120
+ log:: Level :: Warn => write_out ! ( "{}\n " , Paint :: yellow( record. args( ) ) . wrap( ) ) ,
121
+ log:: Level :: Error => write_out ! ( "{}\n " , Paint :: red( record. args( ) ) . wrap( ) ) ,
112
122
log:: Level :: Debug => {
113
- print ! ( "\n {} " , Paint :: blue( "-->" ) . bold( ) ) ;
123
+ write_out ! ( "\n {} " , Paint :: blue( "-->" ) . bold( ) ) ;
114
124
if let Some ( file) = record. file ( ) {
115
- print ! ( "{}" , Paint :: blue( file) ) ;
125
+ write_out ! ( "{}" , Paint :: blue( file) ) ;
116
126
}
117
127
118
128
if let Some ( line) = record. line ( ) {
119
- println ! ( ":{}" , Paint :: blue( line) ) ;
129
+ write_out ! ( ":{}\n " , Paint :: blue( line) ) ;
120
130
}
121
131
122
- println ! ( "\t {}" , record. args( ) ) ;
132
+ write_out ! ( "\t {}\n " , record. args( ) ) ;
123
133
}
124
134
}
125
135
}
0 commit comments