11#![ allow( unused_macros) ]
22use self :: simple_logger:: SimpleLogger ;
33use self :: syslog:: Syslog ;
4- pub use log :: Level ;
4+ use std :: fmt ;
55use std:: ops:: Deref ;
6+ use std:: sync:: OnceLock ;
67
78mod simple_logger;
89mod syslog;
@@ -11,47 +12,51 @@ mod syslog;
1112macro_rules! logger_macro {
1213 ( $name: ident is $rule_level: ident to $target: expr, $d: tt) => {
1314 macro_rules! $name {
14- ( $d( $d arg: tt) +) => ( :: log:: log!( target: $target, $crate:: log:: Level :: $rule_level, $d( $d arg) +) ) ;
15+ ( $d( $d arg: tt) +) => {
16+ if let Some ( logger) = $crate:: log:: LOGGER . get( ) {
17+ logger. log( $crate:: log:: Level :: $rule_level, $target, format_args!( $d( $d arg) +) ) ;
18+ }
19+ } ;
1520 }
1621
17- #[ allow( unused) ]
1822 pub ( crate ) use $name;
1923 } ;
2024 ( $name: ident is $rule_level: ident to $target: expr) => {
2125 logger_macro!( $name is $rule_level to $target, $) ;
2226 } ;
2327}
2428
25- logger_macro ! ( auth_error is Error to "sudo::auth" ) ;
29+ // logger_macro!(auth_error is Error to "sudo::auth");
2630logger_macro ! ( auth_warn is Warn to "sudo::auth" ) ;
2731logger_macro ! ( auth_info is Info to "sudo::auth" ) ;
28- logger_macro ! ( auth_debug is Debug to "sudo::auth" ) ;
29- logger_macro ! ( auth_trace is Trace to "sudo::auth" ) ;
32+ // logger_macro!(auth_debug is Debug to "sudo::auth");
33+ // logger_macro!(auth_trace is Trace to "sudo::auth");
3034
3135logger_macro ! ( user_error is Error to "sudo::user" ) ;
3236logger_macro ! ( user_warn is Warn to "sudo::user" ) ;
3337logger_macro ! ( user_info is Info to "sudo::user" ) ;
34- logger_macro ! ( user_debug is Debug to "sudo::user" ) ;
35- logger_macro ! ( user_trace is Trace to "sudo::user" ) ;
38+ // logger_macro!(user_debug is Debug to "sudo::user");
39+ // logger_macro!(user_trace is Trace to "sudo::user");
3640
37- // TODO: dev_logger_macro has an allow_unused that should be removed
3841macro_rules! dev_logger_macro {
3942 ( $name: ident is $rule_level: ident to $target: expr, $d: tt) => {
4043 macro_rules! $name {
4144 ( $d( $d arg: tt) +) => {
4245 if std:: cfg!( feature = "dev" ) {
43- ( :: log:: log!(
44- target: $target,
45- $crate:: log:: Level :: $rule_level,
46- "{}: {}" ,
47- std:: panic:: Location :: caller( ) ,
48- format_args!( $d( $d arg) +)
49- ) ) ;
46+ if let Some ( logger) = $crate:: log:: LOGGER . get( ) {
47+ logger. log(
48+ $crate:: log:: Level :: $rule_level,
49+ $target,
50+ format_args!( "{}: {}" ,
51+ std:: panic:: Location :: caller( ) ,
52+ format_args!( $d( $d arg) +)
53+ )
54+ ) ;
55+ }
5056 }
5157 } ;
5258 }
5359
54- #[ allow( unused) ]
5560 pub ( crate ) use $name;
5661 } ;
5762 ( $name: ident is $rule_level: ident to $target: expr) => {
@@ -63,10 +68,12 @@ dev_logger_macro!(dev_error is Error to "sudo::dev");
6368dev_logger_macro ! ( dev_warn is Warn to "sudo::dev" ) ;
6469dev_logger_macro ! ( dev_info is Info to "sudo::dev" ) ;
6570dev_logger_macro ! ( dev_debug is Debug to "sudo::dev" ) ;
66- dev_logger_macro ! ( dev_trace is Trace to "sudo::dev" ) ;
71+ //dev_logger_macro!(dev_trace is Trace to "sudo::dev");
72+
73+ pub static LOGGER : OnceLock < SudoLogger > = OnceLock :: new ( ) ;
6774
6875#[ derive( Default ) ]
69- pub struct SudoLogger ( Vec < ( String , Box < dyn log :: Log > ) > ) ;
76+ pub struct SudoLogger ( Vec < ( String , Box < dyn Log > ) > ) ;
7077
7178impl SudoLogger {
7279 pub fn new ( prefix : & ' static str ) -> Self {
@@ -90,25 +97,16 @@ impl SudoLogger {
9097 }
9198
9299 pub fn into_global_logger ( self ) {
93- log :: set_boxed_logger ( Box :: new ( self ) )
94- . map ( | ( ) | log :: set_max_level ( log :: LevelFilter :: Trace ) )
95- . expect ( "Could not set previously set logger" ) ;
100+ if LOGGER . set ( self ) . is_err ( ) {
101+ panic ! ( "Could not set previously set logger" ) ;
102+ }
96103 }
97104
98105 /// Add a logger for a specific prefix to the stack
99106 fn add_logger (
100107 & mut self ,
101108 prefix : impl ToString + Deref < Target = str > ,
102- logger : impl log:: Log + ' static ,
103- ) {
104- self . add_boxed_logger ( prefix, Box :: new ( logger) )
105- }
106-
107- /// Add a boxed logger for a specific prefix to the stack
108- fn add_boxed_logger (
109- & mut self ,
110- prefix : impl ToString + Deref < Target = str > ,
111- logger : Box < dyn log:: Log > ,
109+ logger : impl Log + ' static ,
112110 ) {
113111 let prefix = if prefix. ends_with ( "::" ) {
114112 prefix. to_string ( )
@@ -117,29 +115,32 @@ impl SudoLogger {
117115 // but not `my::prefix_to_somewhere`
118116 format ! ( "{}::" , prefix. to_string( ) )
119117 } ;
120- self . 0 . push ( ( prefix, logger) )
118+ self . 0 . push ( ( prefix, Box :: new ( logger) ) )
121119 }
122120}
123121
124- impl log:: Log for SudoLogger {
125- fn enabled ( & self , metadata : & log:: Metadata ) -> bool {
126- self . 0 . iter ( ) . any ( |( _, l) | l. enabled ( metadata) )
127- }
128-
129- fn log ( & self , record : & log:: Record ) {
122+ impl SudoLogger {
123+ pub fn log ( & self , level : Level , target : & str , args : fmt:: Arguments < ' _ > ) {
130124 for ( prefix, l) in self . 0 . iter ( ) {
131- if record. target ( ) == & prefix[ ..prefix. len ( ) - 2 ] || record. target ( ) . starts_with ( prefix)
132- {
133- l. log ( record) ;
125+ if target == & prefix[ ..prefix. len ( ) - 2 ] || target. starts_with ( prefix) {
126+ l. log ( level, & args) ;
134127 }
135128 }
136129 }
130+ }
137131
138- fn flush ( & self ) {
139- for ( _, l) in self . 0 . iter ( ) {
140- l. flush ( ) ;
141- }
142- }
132+ #[ derive( Clone , Copy , PartialEq , Eq , PartialOrd , Ord , Debug ) ]
133+ #[ allow( unused) ]
134+ pub enum Level {
135+ Error ,
136+ Warn ,
137+ Info ,
138+ Debug ,
139+ Trace ,
140+ }
141+
142+ trait Log : Send + Sync {
143+ fn log ( & self , level : Level , args : & fmt:: Arguments < ' _ > ) ;
143144}
144145
145146#[ cfg( test) ]
0 commit comments