1 // Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT 2 // file at the top-level directory of this distribution and at 3 // http://rust-lang.org/COPYRIGHT. 4 // 5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or 6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license 7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your 8 // option. This file may not be copied, modified, or distributed 9 // except according to those terms. 10 11 /// The standard logging macro. 12 /// 13 /// This macro will generically log with the specified `Level` and `format!` 14 /// based argument list. 15 /// 16 /// # Examples 17 /// 18 /// ``` 19 /// use log::{log, Level}; 20 /// 21 /// # fn main() { 22 /// let data = (42, "Forty-two"); 23 /// let private_data = "private"; 24 /// 25 /// log!(Level::Error, "Received errors: {}, {}", data.0, data.1); 26 /// log!(target: "app_events", Level::Warn, "App warning: {}, {}, {}", 27 /// data.0, data.1, private_data); 28 /// # } 29 /// ``` 30 #[macro_export] 31 macro_rules! log { 32 // log!(target: "my_target", Level::Info, key1:? = 42, key2 = true; "a {} event", "log"); 33 (target: $target:expr, $lvl:expr, $($key:tt $(:$capture:tt)? $(= $value:expr)?),+; $($arg:tt)+) => ({ 34 let lvl = $lvl; 35 if lvl <= $crate::STATIC_MAX_LEVEL && lvl <= $crate::max_level() { 36 $crate::__private_api::log::<&_>( 37 $crate::__private_api::format_args!($($arg)+), 38 lvl, 39 &($target, $crate::__private_api::module_path!(), $crate::__private_api::loc()), 40 &[$(($crate::__log_key!($key), $crate::__log_value!($key $(:$capture)* = $($value)*))),+] 41 ); 42 } 43 }); 44 45 // log!(target: "my_target", Level::Info, "a {} event", "log"); 46 (target: $target:expr, $lvl:expr, $($arg:tt)+) => ({ 47 let lvl = $lvl; 48 if lvl <= $crate::STATIC_MAX_LEVEL && lvl <= $crate::max_level() { 49 $crate::__private_api::log( 50 $crate::__private_api::format_args!($($arg)+), 51 lvl, 52 &($target, $crate::__private_api::module_path!(), $crate::__private_api::loc()), 53 (), 54 ); 55 } 56 }); 57 58 // log!(Level::Info, "a log event") 59 ($lvl:expr, $($arg:tt)+) => ($crate::log!(target: $crate::__private_api::module_path!(), $lvl, $($arg)+)); 60 } 61 62 /// Logs a message at the error level. 63 /// 64 /// # Examples 65 /// 66 /// ``` 67 /// use log::error; 68 /// 69 /// # fn main() { 70 /// let (err_info, port) = ("No connection", 22); 71 /// 72 /// error!("Error: {err_info} on port {port}"); 73 /// error!(target: "app_events", "App Error: {err_info}, Port: {port}"); 74 /// # } 75 /// ``` 76 #[macro_export] 77 macro_rules! error { 78 // error!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log") 79 // error!(target: "my_target", "a {} event", "log") 80 (target: $target:expr, $($arg:tt)+) => ($crate::log!(target: $target, $crate::Level::Error, $($arg)+)); 81 82 // error!("a {} event", "log") 83 ($($arg:tt)+) => ($crate::log!($crate::Level::Error, $($arg)+)) 84 } 85 86 /// Logs a message at the warn level. 87 /// 88 /// # Examples 89 /// 90 /// ``` 91 /// use log::warn; 92 /// 93 /// # fn main() { 94 /// let warn_description = "Invalid Input"; 95 /// 96 /// warn!("Warning! {warn_description}!"); 97 /// warn!(target: "input_events", "App received warning: {warn_description}"); 98 /// # } 99 /// ``` 100 #[macro_export] 101 macro_rules! warn { 102 // warn!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log") 103 // warn!(target: "my_target", "a {} event", "log") 104 (target: $target:expr, $($arg:tt)+) => ($crate::log!(target: $target, $crate::Level::Warn, $($arg)+)); 105 106 // warn!("a {} event", "log") 107 ($($arg:tt)+) => ($crate::log!($crate::Level::Warn, $($arg)+)) 108 } 109 110 /// Logs a message at the info level. 111 /// 112 /// # Examples 113 /// 114 /// ``` 115 /// use log::info; 116 /// 117 /// # fn main() { 118 /// # struct Connection { port: u32, speed: f32 } 119 /// let conn_info = Connection { port: 40, speed: 3.20 }; 120 /// 121 /// info!("Connected to port {} at {} Mb/s", conn_info.port, conn_info.speed); 122 /// info!(target: "connection_events", "Successful connection, port: {}, speed: {}", 123 /// conn_info.port, conn_info.speed); 124 /// # } 125 /// ``` 126 #[macro_export] 127 macro_rules! info { 128 // info!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log") 129 // info!(target: "my_target", "a {} event", "log") 130 (target: $target:expr, $($arg:tt)+) => ($crate::log!(target: $target, $crate::Level::Info, $($arg)+)); 131 132 // info!("a {} event", "log") 133 ($($arg:tt)+) => ($crate::log!($crate::Level::Info, $($arg)+)) 134 } 135 136 /// Logs a message at the debug level. 137 /// 138 /// # Examples 139 /// 140 /// ``` 141 /// use log::debug; 142 /// 143 /// # fn main() { 144 /// # struct Position { x: f32, y: f32 } 145 /// let pos = Position { x: 3.234, y: -1.223 }; 146 /// 147 /// debug!("New position: x: {}, y: {}", pos.x, pos.y); 148 /// debug!(target: "app_events", "New position: x: {}, y: {}", pos.x, pos.y); 149 /// # } 150 /// ``` 151 #[macro_export] 152 macro_rules! debug { 153 // debug!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log") 154 // debug!(target: "my_target", "a {} event", "log") 155 (target: $target:expr, $($arg:tt)+) => ($crate::log!(target: $target, $crate::Level::Debug, $($arg)+)); 156 157 // debug!("a {} event", "log") 158 ($($arg:tt)+) => ($crate::log!($crate::Level::Debug, $($arg)+)) 159 } 160 161 /// Logs a message at the trace level. 162 /// 163 /// # Examples 164 /// 165 /// ``` 166 /// use log::trace; 167 /// 168 /// # fn main() { 169 /// # struct Position { x: f32, y: f32 } 170 /// let pos = Position { x: 3.234, y: -1.223 }; 171 /// 172 /// trace!("Position is: x: {}, y: {}", pos.x, pos.y); 173 /// trace!(target: "app_events", "x is {} and y is {}", 174 /// if pos.x >= 0.0 { "positive" } else { "negative" }, 175 /// if pos.y >= 0.0 { "positive" } else { "negative" }); 176 /// # } 177 /// ``` 178 #[macro_export] 179 macro_rules! trace { 180 // trace!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log") 181 // trace!(target: "my_target", "a {} event", "log") 182 (target: $target:expr, $($arg:tt)+) => ($crate::log!(target: $target, $crate::Level::Trace, $($arg)+)); 183 184 // trace!("a {} event", "log") 185 ($($arg:tt)+) => ($crate::log!($crate::Level::Trace, $($arg)+)) 186 } 187 188 /// Determines if a message logged at the specified level in that module will 189 /// be logged. 190 /// 191 /// This can be used to avoid expensive computation of log message arguments if 192 /// the message would be ignored anyway. 193 /// 194 /// # Examples 195 /// 196 /// ``` 197 /// use log::Level::Debug; 198 /// use log::{debug, log_enabled}; 199 /// 200 /// # fn foo() { 201 /// if log_enabled!(Debug) { 202 /// let data = expensive_call(); 203 /// debug!("expensive debug data: {} {}", data.x, data.y); 204 /// } 205 /// if log_enabled!(target: "Global", Debug) { 206 /// let data = expensive_call(); 207 /// debug!(target: "Global", "expensive debug data: {} {}", data.x, data.y); 208 /// } 209 /// # } 210 /// # struct Data { x: u32, y: u32 } 211 /// # fn expensive_call() -> Data { Data { x: 0, y: 0 } } 212 /// # fn main() {} 213 /// ``` 214 #[macro_export] 215 macro_rules! log_enabled { 216 (target: $target:expr, $lvl:expr) => {{ 217 let lvl = $lvl; 218 lvl <= $crate::STATIC_MAX_LEVEL 219 && lvl <= $crate::max_level() 220 && $crate::__private_api::enabled(lvl, $target) 221 }}; 222 ($lvl:expr) => { 223 $crate::log_enabled!(target: $crate::__private_api::module_path!(), $lvl) 224 }; 225 } 226 227 // These macros use a pattern of #[cfg]s to produce nicer error 228 // messages when log features aren't available 229 230 #[doc(hidden)] 231 #[macro_export] 232 #[cfg(feature = "kv")] 233 macro_rules! __log_key { 234 // key1 = 42 235 ($($args:ident)*) => { 236 $crate::__private_api::stringify!($($args)*) 237 }; 238 // "key1" = 42 239 ($($args:expr)*) => { 240 $($args)* 241 }; 242 } 243 244 #[doc(hidden)] 245 #[macro_export] 246 #[cfg(not(feature = "kv"))] 247 macro_rules! __log_key { 248 ($($args:tt)*) => { 249 compile_error!("key value support requires the `kv` feature of `log`") 250 }; 251 } 252 253 #[doc(hidden)] 254 #[macro_export] 255 #[cfg(feature = "kv")] 256 macro_rules! __log_value { 257 // Entrypoint 258 ($key:tt = $args:expr) => { 259 $crate::__log_value!(($args):value) 260 }; 261 ($key:tt :$capture:tt = $args:expr) => { 262 $crate::__log_value!(($args):$capture) 263 }; 264 ($key:ident =) => { 265 $crate::__log_value!(($key):value) 266 }; 267 ($key:ident :$capture:tt =) => { 268 $crate::__log_value!(($key):$capture) 269 }; 270 // ToValue 271 (($args:expr):value) => { 272 $crate::__private_api::capture_to_value(&&$args) 273 }; 274 // Debug 275 (($args:expr):?) => { 276 $crate::__private_api::capture_debug(&&$args) 277 }; 278 (($args:expr):debug) => { 279 $crate::__private_api::capture_debug(&&$args) 280 }; 281 // Display 282 (($args:expr):%) => { 283 $crate::__private_api::capture_display(&&$args) 284 }; 285 (($args:expr):display) => { 286 $crate::__private_api::capture_display(&&$args) 287 }; 288 //Error 289 (($args:expr):err) => { 290 $crate::__log_value_error!($args) 291 }; 292 // sval::Value 293 (($args:expr):sval) => { 294 $crate::__log_value_sval!($args) 295 }; 296 // serde::Serialize 297 (($args:expr):serde) => { 298 $crate::__log_value_serde!($args) 299 }; 300 } 301 302 #[doc(hidden)] 303 #[macro_export] 304 #[cfg(not(feature = "kv"))] 305 macro_rules! __log_value { 306 ($($args:tt)*) => { 307 compile_error!("key value support requires the `kv` feature of `log`") 308 }; 309 } 310 311 #[doc(hidden)] 312 #[macro_export] 313 #[cfg(feature = "kv_sval")] 314 macro_rules! __log_value_sval { 315 ($args:expr) => { 316 $crate::__private_api::capture_sval(&&$args) 317 }; 318 } 319 320 #[doc(hidden)] 321 #[macro_export] 322 #[cfg(not(feature = "kv_sval"))] 323 macro_rules! __log_value_sval { 324 ($args:expr) => { 325 compile_error!("capturing values as `sval::Value` requites the `kv_sval` feature of `log`") 326 }; 327 } 328 329 #[doc(hidden)] 330 #[macro_export] 331 #[cfg(feature = "kv_serde")] 332 macro_rules! __log_value_serde { 333 ($args:expr) => { 334 $crate::__private_api::capture_serde(&&$args) 335 }; 336 } 337 338 #[doc(hidden)] 339 #[macro_export] 340 #[cfg(not(feature = "kv_serde"))] 341 macro_rules! __log_value_serde { 342 ($args:expr) => { 343 compile_error!( 344 "capturing values as `serde::Serialize` requites the `kv_serde` feature of `log`" 345 ) 346 }; 347 } 348 349 #[doc(hidden)] 350 #[macro_export] 351 #[cfg(feature = "kv_std")] 352 macro_rules! __log_value_error { 353 ($args:expr) => { 354 $crate::__private_api::capture_error(&$args) 355 }; 356 } 357 358 #[doc(hidden)] 359 #[macro_export] 360 #[cfg(not(feature = "kv_std"))] 361 macro_rules! __log_value_error { 362 ($args:expr) => { 363 compile_error!( 364 "capturing values as `std::error::Error` requites the `kv_std` feature of `log`" 365 ) 366 }; 367 } 368