11//! Log handling implementations for the logger.
22
33use std:: {
4- fmt:: Debug ,
54 fs:: OpenOptions ,
65 io:: Write ,
6+ sync:: Mutex ,
77 time:: SystemTime ,
88} ;
99
10- use crate :: LogLevel ;
10+ use crate :: {
11+ LogLevel ,
12+ Record ,
13+ } ;
1114
1215/// Pluggable sink for log records emitted by the `Logger`.
13- ///
14- /// Implementors decide how to format and where to deliver messages for each
15- /// severity level.
16- pub trait Handler {
17- fn trace ( & mut self , message : String ) ;
18- fn debug ( & mut self , message : String ) ;
19- fn info ( & mut self , message : String ) ;
20- fn warn ( & mut self , message : String ) ;
21- fn error ( & mut self , message : String ) ;
22- fn fatal ( & mut self , message : String ) ;
16+ /// Implementors decide how to format and where to deliver messages.
17+ pub trait Handler : Send + Sync {
18+ fn log ( & self , record : & Record ) ;
2319}
2420
2521/// A handler that logs to a file.
26-
27- #[ derive( Debug , Clone , PartialEq , PartialOrd ) ]
22+ #[ derive( Debug ) ]
2823pub struct FileHandler {
2924 file : String ,
30- log_buffer : Vec < String > ,
25+ log_buffer : Mutex < Vec < String > > ,
3126}
3227
3328impl FileHandler {
3429 pub fn new ( file : String ) -> Self {
3530 Self {
3631 file,
37- log_buffer : Vec :: new ( ) ,
32+ log_buffer : Mutex :: new ( Vec :: new ( ) ) ,
3833 }
3934 }
35+ }
4036
41- /// Logs a message to the file.
42- fn log ( & mut self , log_level : LogLevel , message : String ) {
43- let timestamp = SystemTime :: now ( )
37+ impl Handler for FileHandler {
38+ fn log ( & self , record : & Record ) {
39+ let timestamp = record
40+ . timestamp
4441 . duration_since ( SystemTime :: UNIX_EPOCH )
4542 . unwrap ( )
4643 . as_secs ( ) ;
4744
48- let log_message = format ! ( "[{}]-[{:?}]: {}" , timestamp, log_level, message) ;
45+ let log_message =
46+ format ! ( "[{}]-[{:?}]: {}" , timestamp, record. level, record. message) ;
4947
50- let colored_message = match log_level {
48+ // Preserve existing behavior: color codes even in file output.
49+ let colored_message = match record. level {
5150 LogLevel :: TRACE => format ! ( "\x1B [37m{}\x1B [0m" , log_message) ,
5251 LogLevel :: DEBUG => format ! ( "\x1B [35m{}\x1B [0m" , log_message) ,
5352 LogLevel :: INFO => format ! ( "\x1B [32m{}\x1B [0m" , log_message) ,
@@ -56,14 +55,15 @@ impl FileHandler {
5655 LogLevel :: FATAL => format ! ( "\x1B [31;1m{}\x1B [0m" , log_message) ,
5756 } ;
5857
59- self . log_buffer . push ( colored_message) ;
58+ let mut buf = self . log_buffer . lock ( ) . unwrap ( ) ;
59+ buf. push ( colored_message) ;
6060
6161 // Flush buffer every ten messages.
62- if self . log_buffer . len ( ) < 10 {
62+ if buf . len ( ) < 10 {
6363 return ;
6464 }
6565
66- let log_message = self . log_buffer . join ( "\n " ) ;
66+ let log_message = buf . join ( "\n " ) ;
6767
6868 let mut file = OpenOptions :: new ( )
6969 . append ( true )
@@ -75,61 +75,37 @@ impl FileHandler {
7575 . write_all ( log_message. as_bytes ( ) )
7676 . expect ( "Unable to write data" ) ;
7777
78- self . log_buffer . clear ( ) ;
79- }
80- }
81-
82- impl Handler for FileHandler {
83- fn trace ( & mut self , message : String ) {
84- self . log ( LogLevel :: TRACE , message)
85- }
86-
87- fn debug ( & mut self , message : String ) {
88- self . log ( LogLevel :: DEBUG , message)
89- }
90-
91- fn info ( & mut self , message : String ) {
92- self . log ( LogLevel :: INFO , message)
93- }
94-
95- fn warn ( & mut self , message : String ) {
96- self . log ( LogLevel :: WARN , message)
97- }
98-
99- fn error ( & mut self , message : String ) {
100- self . log ( LogLevel :: ERROR , message)
101- }
102-
103- fn fatal ( & mut self , message : String ) {
104- self . log ( LogLevel :: FATAL , message)
78+ buf. clear ( ) ;
10579 }
10680}
10781
10882#[ derive( Debug , Clone , PartialEq , PartialOrd ) ]
109- /// A handler that prints colored log lines to stdout.
11083pub struct ConsoleHandler {
11184 name : String ,
11285}
11386
11487impl ConsoleHandler {
11588 pub fn new ( name : & str ) -> Self {
116- return Self {
89+ Self {
11790 name : name. to_string ( ) ,
118- } ;
91+ }
11992 }
93+ }
12094
121- fn log ( & mut self , log_level : LogLevel , message : String ) {
122- let timestamp = SystemTime :: now ( )
95+ impl Handler for ConsoleHandler {
96+ fn log ( & self , record : & Record ) {
97+ let timestamp = record
98+ . timestamp
12399 . duration_since ( SystemTime :: UNIX_EPOCH )
124100 . unwrap ( )
125101 . as_secs ( ) ;
126102
127103 let log_message = format ! (
128104 "[{}]-[{:?}]-[{}]: {}" ,
129- timestamp, log_level , self . name, message
105+ timestamp, record . level , self . name, record . message
130106 ) ;
131107
132- let colored_message = match log_level {
108+ let colored_message = match record . level {
133109 LogLevel :: TRACE => format ! ( "\x1B [37m{}\x1B [0m" , log_message) ,
134110 LogLevel :: DEBUG => format ! ( "\x1B [35m{}\x1B [0m" , log_message) ,
135111 LogLevel :: INFO => format ! ( "\x1B [32m{}\x1B [0m" , log_message) ,
@@ -141,29 +117,3 @@ impl ConsoleHandler {
141117 println ! ( "{}" , colored_message) ;
142118 }
143119}
144-
145- impl Handler for ConsoleHandler {
146- fn trace ( & mut self , message : String ) {
147- self . log ( LogLevel :: TRACE , message) ;
148- }
149-
150- fn debug ( & mut self , message : String ) {
151- self . log ( LogLevel :: DEBUG , message) ;
152- }
153-
154- fn info ( & mut self , message : String ) {
155- self . log ( LogLevel :: INFO , message) ;
156- }
157-
158- fn warn ( & mut self , message : String ) {
159- self . log ( LogLevel :: WARN , message) ;
160- }
161-
162- fn error ( & mut self , message : String ) {
163- self . log ( LogLevel :: ERROR , message) ;
164- }
165-
166- fn fatal ( & mut self , message : String ) {
167- self . log ( LogLevel :: FATAL , message) ;
168- }
169- }
0 commit comments