1*61c4878aSAndroid Build Coastguard Worker // Copyright 2023 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker // 3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker // the License at 6*61c4878aSAndroid Build Coastguard Worker // 7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker // 9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker // the License. 14*61c4878aSAndroid Build Coastguard Worker 15*61c4878aSAndroid Build Coastguard Worker //! `pw_log` is an extensible logging system that can delegate to 16*61c4878aSAndroid Build Coastguard Worker //! pre-existing logging APIs without upstream changes. 17*61c4878aSAndroid Build Coastguard Worker //! 18*61c4878aSAndroid Build Coastguard Worker //! Clients of `pw_log` simply import and use the logging API, and 19*61c4878aSAndroid Build Coastguard Worker //! log invocations will be handled by the provided logging backend. 20*61c4878aSAndroid Build Coastguard Worker //! 21*61c4878aSAndroid Build Coastguard Worker //! This flexibility is accomplished using Pigweed's 22*61c4878aSAndroid Build Coastguard Worker //! [facade pattern](https://pigweed.dev/docs/facades.html), 23*61c4878aSAndroid Build Coastguard Worker //! which uses build-system redirection to forward log invocations to the 24*61c4878aSAndroid Build Coastguard Worker //! configured backend implementation. 25*61c4878aSAndroid Build Coastguard Worker //! 26*61c4878aSAndroid Build Coastguard Worker //! ``` 27*61c4878aSAndroid Build Coastguard Worker //! use pw_log::{log, info, LogLevel}; 28*61c4878aSAndroid Build Coastguard Worker //! 29*61c4878aSAndroid Build Coastguard Worker //! log!(LogLevel::Info, "Thank you for signing up for Log Facts!"); 30*61c4878aSAndroid Build Coastguard Worker //! info!("Log Fact: Logs can be either {}, {}, or {} sawn.", 31*61c4878aSAndroid Build Coastguard Worker //! "flat" as &str, "quarter" as &str, "rift" as &str); 32*61c4878aSAndroid Build Coastguard Worker //! ``` 33*61c4878aSAndroid Build Coastguard Worker //! 34*61c4878aSAndroid Build Coastguard Worker //! Today `printf` style format strings are well supported with Rust 35*61c4878aSAndroid Build Coastguard Worker //! [`core::fmt`]/`println!()` style strings partially supported 36*61c4878aSAndroid Build Coastguard Worker //! ([b/311232607](https://issues.pigweed.dev/issues/311232607)). 37*61c4878aSAndroid Build Coastguard Worker //! 38*61c4878aSAndroid Build Coastguard Worker //! Currently, when using a `stable` toolchain, "untyped" arguments (i.e. 39*61c4878aSAndroid Build Coastguard Worker //! `{}` style) need to be in the form of an as-cast. Users with nightly 40*61c4878aSAndroid Build Coastguard Worker //! toolchains can enable the `nightly_tait` feature to remove this restriction. 41*61c4878aSAndroid Build Coastguard Worker //! 42*61c4878aSAndroid Build Coastguard Worker //! TODO: <pwbug.dev/311266298> - Document `pw_log`'s backend API. 43*61c4878aSAndroid Build Coastguard Worker //! 44*61c4878aSAndroid Build Coastguard Worker //! TODO: <pwbug.dev/311232605> - Document how to configure facade backends. 45*61c4878aSAndroid Build Coastguard Worker #![cfg_attr(not(feature = "std"), no_std)] 46*61c4878aSAndroid Build Coastguard Worker #![deny(missing_docs)] 47*61c4878aSAndroid Build Coastguard Worker 48*61c4878aSAndroid Build Coastguard Worker pub use pw_log_backend_api::LogLevel; 49*61c4878aSAndroid Build Coastguard Worker 50*61c4878aSAndroid Build Coastguard Worker // Re-export dependences of `pw_log` macros to be accessed via `$crate::__private`. 51*61c4878aSAndroid Build Coastguard Worker #[doc(hidden)] 52*61c4878aSAndroid Build Coastguard Worker pub mod __private { 53*61c4878aSAndroid Build Coastguard Worker pub use crate::*; 54*61c4878aSAndroid Build Coastguard Worker // pub use pw_log_backend; 55*61c4878aSAndroid Build Coastguard Worker pub use pw_log_backend::{pw_log_backend, pw_logf_backend}; 56*61c4878aSAndroid Build Coastguard Worker } 57*61c4878aSAndroid Build Coastguard Worker 58*61c4878aSAndroid Build Coastguard Worker /// Emit a log message using `core::fmt` format string semantics. 59*61c4878aSAndroid Build Coastguard Worker /// 60*61c4878aSAndroid Build Coastguard Worker /// `log` takes a [`LogLevel`], a `core::fmt` style format string, and necessary 61*61c4878aSAndroid Build Coastguard Worker /// arguments to that string and emits a log message to the logging backend. 62*61c4878aSAndroid Build Coastguard Worker /// 63*61c4878aSAndroid Build Coastguard Worker /// ``` 64*61c4878aSAndroid Build Coastguard Worker /// use pw_log::{log, LogLevel}; 65*61c4878aSAndroid Build Coastguard Worker /// 66*61c4878aSAndroid Build Coastguard Worker /// log!(LogLevel::Info, "Log fact: A {} log has a Janka hardness of {} lbf.", 67*61c4878aSAndroid Build Coastguard Worker /// "Spruce Pine" as &str, 700 as i32); 68*61c4878aSAndroid Build Coastguard Worker /// ``` 69*61c4878aSAndroid Build Coastguard Worker #[macro_export] 70*61c4878aSAndroid Build Coastguard Worker macro_rules! log { 71*61c4878aSAndroid Build Coastguard Worker ($log_level:expr, $format_string:literal) => {{ 72*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 73*61c4878aSAndroid Build Coastguard Worker $crate::__private::pw_log_backend!($log_level, $format_string) 74*61c4878aSAndroid Build Coastguard Worker }}; 75*61c4878aSAndroid Build Coastguard Worker 76*61c4878aSAndroid Build Coastguard Worker ($log_level:expr, $format_string:literal, $($args:expr),*) => {{ 77*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 78*61c4878aSAndroid Build Coastguard Worker $crate::__private::pw_log_backend!($log_level, $format_string, $($args),*) 79*61c4878aSAndroid Build Coastguard Worker }}; 80*61c4878aSAndroid Build Coastguard Worker } 81*61c4878aSAndroid Build Coastguard Worker 82*61c4878aSAndroid Build Coastguard Worker /// Emit a log message using `printf` format string semantics. 83*61c4878aSAndroid Build Coastguard Worker /// 84*61c4878aSAndroid Build Coastguard Worker /// `logf` takes a [`LogLevel`], a `printf` style format string, and necessary 85*61c4878aSAndroid Build Coastguard Worker /// arguments to that string and emits a log message to the logging backend. 86*61c4878aSAndroid Build Coastguard Worker /// 87*61c4878aSAndroid Build Coastguard Worker /// ``` 88*61c4878aSAndroid Build Coastguard Worker /// use pw_log::{logf, LogLevel}; 89*61c4878aSAndroid Build Coastguard Worker /// 90*61c4878aSAndroid Build Coastguard Worker /// logf!(LogLevel::Info, "Log fact: A %s log has a Janka hardness of %d lbf.", 91*61c4878aSAndroid Build Coastguard Worker /// "Spruce Pine", 700); 92*61c4878aSAndroid Build Coastguard Worker /// ``` 93*61c4878aSAndroid Build Coastguard Worker #[macro_export] 94*61c4878aSAndroid Build Coastguard Worker macro_rules! logf { 95*61c4878aSAndroid Build Coastguard Worker ($log_level:expr, $format_string:literal) => {{ 96*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 97*61c4878aSAndroid Build Coastguard Worker $crate::__private::pw_logf_backend!($log_level, $format_string) 98*61c4878aSAndroid Build Coastguard Worker }}; 99*61c4878aSAndroid Build Coastguard Worker 100*61c4878aSAndroid Build Coastguard Worker ($log_level:expr, $format_string:literal, $($args:expr),*) => {{ 101*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 102*61c4878aSAndroid Build Coastguard Worker $crate::__private::pw_logf_backend!($log_level, $format_string, $($args),*) 103*61c4878aSAndroid Build Coastguard Worker }}; 104*61c4878aSAndroid Build Coastguard Worker } 105*61c4878aSAndroid Build Coastguard Worker 106*61c4878aSAndroid Build Coastguard Worker /// Deprecated alias for [`logf!`]. 107*61c4878aSAndroid Build Coastguard Worker #[macro_export] 108*61c4878aSAndroid Build Coastguard Worker macro_rules! pw_logf { 109*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 110*61c4878aSAndroid Build Coastguard Worker logf!($($args),*) 111*61c4878aSAndroid Build Coastguard Worker }} 112*61c4878aSAndroid Build Coastguard Worker } 113*61c4878aSAndroid Build Coastguard Worker 114*61c4878aSAndroid Build Coastguard Worker /// Emit a debug level log message using `core:fmt` format string semantics. 115*61c4878aSAndroid Build Coastguard Worker /// 116*61c4878aSAndroid Build Coastguard Worker /// ``` 117*61c4878aSAndroid Build Coastguard Worker /// use pw_log::debug; 118*61c4878aSAndroid Build Coastguard Worker /// 119*61c4878aSAndroid Build Coastguard Worker /// debug!("Log Fact: The American toy Lincoln Logs were inspired by the {} in {}.", 120*61c4878aSAndroid Build Coastguard Worker /// "Imperial Hotel" as &str, "Tokyo" as &str); 121*61c4878aSAndroid Build Coastguard Worker /// ``` 122*61c4878aSAndroid Build Coastguard Worker #[macro_export] 123*61c4878aSAndroid Build Coastguard Worker macro_rules! debug { 124*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 125*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 126*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::log!(__pw_log_crate::LogLevel::Debug, $($args),*) 127*61c4878aSAndroid Build Coastguard Worker }}; 128*61c4878aSAndroid Build Coastguard Worker } 129*61c4878aSAndroid Build Coastguard Worker 130*61c4878aSAndroid Build Coastguard Worker /// Emit a debug level log message using `printf` format string semantics. 131*61c4878aSAndroid Build Coastguard Worker /// 132*61c4878aSAndroid Build Coastguard Worker /// ``` 133*61c4878aSAndroid Build Coastguard Worker /// use pw_log::debugf; 134*61c4878aSAndroid Build Coastguard Worker /// 135*61c4878aSAndroid Build Coastguard Worker /// debugf!("Log Fact: The American toy Lincoln Logs were inspired by the %s in %s.", 136*61c4878aSAndroid Build Coastguard Worker /// "Imperial Hotel", "Tokyo"); 137*61c4878aSAndroid Build Coastguard Worker /// ``` 138*61c4878aSAndroid Build Coastguard Worker #[macro_export] 139*61c4878aSAndroid Build Coastguard Worker macro_rules! debugf { 140*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 141*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 142*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::logf!(__pw_log_crate::LogLevel::Debug, $($args),*) 143*61c4878aSAndroid Build Coastguard Worker }}; 144*61c4878aSAndroid Build Coastguard Worker } 145*61c4878aSAndroid Build Coastguard Worker 146*61c4878aSAndroid Build Coastguard Worker /// Deprecated alias for [`debugf!`]. 147*61c4878aSAndroid Build Coastguard Worker #[macro_export] 148*61c4878aSAndroid Build Coastguard Worker macro_rules! pw_log_debugf { 149*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 150*61c4878aSAndroid Build Coastguard Worker debugf!($($args),*) 151*61c4878aSAndroid Build Coastguard Worker }} 152*61c4878aSAndroid Build Coastguard Worker } 153*61c4878aSAndroid Build Coastguard Worker 154*61c4878aSAndroid Build Coastguard Worker /// Emit an info level log message using `core:fmt` format string semantics. 155*61c4878aSAndroid Build Coastguard Worker /// 156*61c4878aSAndroid Build Coastguard Worker /// ``` 157*61c4878aSAndroid Build Coastguard Worker /// use pw_log::info; 158*61c4878aSAndroid Build Coastguard Worker /// 159*61c4878aSAndroid Build Coastguard Worker /// info!( 160*61c4878aSAndroid Build Coastguard Worker /// "Log Fact: The American president Abraham Lincoln (born {:x}) once lived in a log cabin.", 161*61c4878aSAndroid Build Coastguard Worker /// 0x1809 as u32); 162*61c4878aSAndroid Build Coastguard Worker /// ``` 163*61c4878aSAndroid Build Coastguard Worker #[macro_export] 164*61c4878aSAndroid Build Coastguard Worker macro_rules! info { 165*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 166*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 167*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::log!(__pw_log_crate::LogLevel::Info, $($args),*) 168*61c4878aSAndroid Build Coastguard Worker }}; 169*61c4878aSAndroid Build Coastguard Worker } 170*61c4878aSAndroid Build Coastguard Worker 171*61c4878aSAndroid Build Coastguard Worker /// Emit an info level log message using `printf` format string semantics. 172*61c4878aSAndroid Build Coastguard Worker /// 173*61c4878aSAndroid Build Coastguard Worker /// ``` 174*61c4878aSAndroid Build Coastguard Worker /// use pw_log::infof; 175*61c4878aSAndroid Build Coastguard Worker /// 176*61c4878aSAndroid Build Coastguard Worker /// infof!( 177*61c4878aSAndroid Build Coastguard Worker /// "Log Fact: The American president Abraham Lincoln (born %x) once lived in a log cabin.", 178*61c4878aSAndroid Build Coastguard Worker /// 0x1809); 179*61c4878aSAndroid Build Coastguard Worker /// ``` 180*61c4878aSAndroid Build Coastguard Worker #[macro_export] 181*61c4878aSAndroid Build Coastguard Worker macro_rules! infof { 182*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 183*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 184*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::logf!(__pw_log_crate::LogLevel::Info, $($args),*) 185*61c4878aSAndroid Build Coastguard Worker }}; 186*61c4878aSAndroid Build Coastguard Worker } 187*61c4878aSAndroid Build Coastguard Worker 188*61c4878aSAndroid Build Coastguard Worker /// Deprecated alias for [`infof!`]. 189*61c4878aSAndroid Build Coastguard Worker #[macro_export] 190*61c4878aSAndroid Build Coastguard Worker macro_rules! pw_log_infof { 191*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 192*61c4878aSAndroid Build Coastguard Worker infof!($($args),*) 193*61c4878aSAndroid Build Coastguard Worker }} 194*61c4878aSAndroid Build Coastguard Worker } 195*61c4878aSAndroid Build Coastguard Worker 196*61c4878aSAndroid Build Coastguard Worker /// Emit a warn level log message using `core::fmt` format string semantics. 197*61c4878aSAndroid Build Coastguard Worker /// 198*61c4878aSAndroid Build Coastguard Worker /// ``` 199*61c4878aSAndroid Build Coastguard Worker /// use pw_log::warn; 200*61c4878aSAndroid Build Coastguard Worker /// 201*61c4878aSAndroid Build Coastguard Worker /// warn!( 202*61c4878aSAndroid Build Coastguard Worker /// "Log Fact: Made from a log, an {} year old dugout canoe is the oldest discovered boat in {}.", 203*61c4878aSAndroid Build Coastguard Worker /// 8000 as i32, "Africa" as &str); 204*61c4878aSAndroid Build Coastguard Worker /// ``` 205*61c4878aSAndroid Build Coastguard Worker #[macro_export] 206*61c4878aSAndroid Build Coastguard Worker macro_rules! warn { 207*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 208*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 209*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::log!(__pw_log_crate::LogLevel::Warn, $($args),*) 210*61c4878aSAndroid Build Coastguard Worker }}; 211*61c4878aSAndroid Build Coastguard Worker } 212*61c4878aSAndroid Build Coastguard Worker 213*61c4878aSAndroid Build Coastguard Worker /// Emit a warn level log message using `printf` format string semantics. 214*61c4878aSAndroid Build Coastguard Worker /// 215*61c4878aSAndroid Build Coastguard Worker /// ``` 216*61c4878aSAndroid Build Coastguard Worker /// use pw_log::warnf; 217*61c4878aSAndroid Build Coastguard Worker /// 218*61c4878aSAndroid Build Coastguard Worker /// warnf!( 219*61c4878aSAndroid Build Coastguard Worker /// "Log Fact: Made from a log, an %d year old dugout canoe is the oldest discovered boat in %s.", 220*61c4878aSAndroid Build Coastguard Worker /// 8000, "Africa"); 221*61c4878aSAndroid Build Coastguard Worker /// ``` 222*61c4878aSAndroid Build Coastguard Worker #[macro_export] 223*61c4878aSAndroid Build Coastguard Worker macro_rules! warnf { 224*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 225*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 226*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::logf!(__pw_log_crate::LogLevel::Warn, $($args),*) 227*61c4878aSAndroid Build Coastguard Worker }}; 228*61c4878aSAndroid Build Coastguard Worker } 229*61c4878aSAndroid Build Coastguard Worker 230*61c4878aSAndroid Build Coastguard Worker /// Deprecated alias for [`warnf!`]. 231*61c4878aSAndroid Build Coastguard Worker #[macro_export] 232*61c4878aSAndroid Build Coastguard Worker macro_rules! pw_log_warnf { 233*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 234*61c4878aSAndroid Build Coastguard Worker warnf!($($args),*) 235*61c4878aSAndroid Build Coastguard Worker }} 236*61c4878aSAndroid Build Coastguard Worker } 237*61c4878aSAndroid Build Coastguard Worker 238*61c4878aSAndroid Build Coastguard Worker /// Emit an error level log message using `core::fmt` format string semantics. 239*61c4878aSAndroid Build Coastguard Worker /// 240*61c4878aSAndroid Build Coastguard Worker /// ``` 241*61c4878aSAndroid Build Coastguard Worker /// use pw_log::error; 242*61c4878aSAndroid Build Coastguard Worker /// 243*61c4878aSAndroid Build Coastguard Worker /// error!( 244*61c4878aSAndroid Build Coastguard Worker /// "Log Fact: Before saws were invented, the {} was used prepare logs for use.", 245*61c4878aSAndroid Build Coastguard Worker /// "adze" as &str); 246*61c4878aSAndroid Build Coastguard Worker /// ``` 247*61c4878aSAndroid Build Coastguard Worker #[macro_export] 248*61c4878aSAndroid Build Coastguard Worker macro_rules! error { 249*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 250*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 251*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::log!(__pw_log_crate::LogLevel::Error, $($args),*) 252*61c4878aSAndroid Build Coastguard Worker }}; 253*61c4878aSAndroid Build Coastguard Worker } 254*61c4878aSAndroid Build Coastguard Worker 255*61c4878aSAndroid Build Coastguard Worker /// Emit an error level log message using `printf` format string semantics. 256*61c4878aSAndroid Build Coastguard Worker /// 257*61c4878aSAndroid Build Coastguard Worker /// ``` 258*61c4878aSAndroid Build Coastguard Worker /// use pw_log::errorf; 259*61c4878aSAndroid Build Coastguard Worker /// 260*61c4878aSAndroid Build Coastguard Worker /// errorf!( 261*61c4878aSAndroid Build Coastguard Worker /// "Log Fact: Before saws were invented, the %s was used prepare logs for use.", 262*61c4878aSAndroid Build Coastguard Worker /// "adze"); 263*61c4878aSAndroid Build Coastguard Worker /// ``` 264*61c4878aSAndroid Build Coastguard Worker #[macro_export] 265*61c4878aSAndroid Build Coastguard Worker macro_rules! errorf { 266*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 267*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 268*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::logf!(__pw_log_crate::LogLevel::Error, $($args),*) 269*61c4878aSAndroid Build Coastguard Worker }}; 270*61c4878aSAndroid Build Coastguard Worker } 271*61c4878aSAndroid Build Coastguard Worker 272*61c4878aSAndroid Build Coastguard Worker /// Deprecated alias for [`errorf!`]. 273*61c4878aSAndroid Build Coastguard Worker #[macro_export] 274*61c4878aSAndroid Build Coastguard Worker macro_rules! pw_log_errorf { 275*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 276*61c4878aSAndroid Build Coastguard Worker errorf!($($args),*) 277*61c4878aSAndroid Build Coastguard Worker }} 278*61c4878aSAndroid Build Coastguard Worker } 279*61c4878aSAndroid Build Coastguard Worker 280*61c4878aSAndroid Build Coastguard Worker /// Emit a critical level log message using `core::fmt` format string semantics. 281*61c4878aSAndroid Build Coastguard Worker /// 282*61c4878aSAndroid Build Coastguard Worker /// ``` 283*61c4878aSAndroid Build Coastguard Worker /// use pw_log::critical; 284*61c4878aSAndroid Build Coastguard Worker /// 285*61c4878aSAndroid Build Coastguard Worker /// critical!( 286*61c4878aSAndroid Build Coastguard Worker /// "Log Fact: Until the {}th century, all ships' masts were made from a single log.", 287*61c4878aSAndroid Build Coastguard Worker /// 19 as u32); 288*61c4878aSAndroid Build Coastguard Worker /// ``` 289*61c4878aSAndroid Build Coastguard Worker #[macro_export] 290*61c4878aSAndroid Build Coastguard Worker macro_rules! critical { 291*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 292*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 293*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::log!(__pw_log_crate::LogLevel::Critical, $($args),*) 294*61c4878aSAndroid Build Coastguard Worker }}; 295*61c4878aSAndroid Build Coastguard Worker } 296*61c4878aSAndroid Build Coastguard Worker 297*61c4878aSAndroid Build Coastguard Worker /// Emit a critical level log message using `printf` format string semantics. 298*61c4878aSAndroid Build Coastguard Worker /// 299*61c4878aSAndroid Build Coastguard Worker /// ``` 300*61c4878aSAndroid Build Coastguard Worker /// use pw_log::{criticalf, LogLevel}; 301*61c4878aSAndroid Build Coastguard Worker /// 302*61c4878aSAndroid Build Coastguard Worker /// criticalf!( 303*61c4878aSAndroid Build Coastguard Worker /// "Log Fact: Until the %dth century, all ships' masts were made from a single log.", 304*61c4878aSAndroid Build Coastguard Worker /// 19); 305*61c4878aSAndroid Build Coastguard Worker /// ``` 306*61c4878aSAndroid Build Coastguard Worker #[macro_export] 307*61c4878aSAndroid Build Coastguard Worker macro_rules! criticalf { 308*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 309*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 310*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::logf!(__pw_log_crate::LogLevel::Critical, $($args),*) 311*61c4878aSAndroid Build Coastguard Worker }}; 312*61c4878aSAndroid Build Coastguard Worker } 313*61c4878aSAndroid Build Coastguard Worker 314*61c4878aSAndroid Build Coastguard Worker /// Deprecated alias for [`criticalf!`]. 315*61c4878aSAndroid Build Coastguard Worker #[macro_export] 316*61c4878aSAndroid Build Coastguard Worker macro_rules! pw_log_criticalf { 317*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 318*61c4878aSAndroid Build Coastguard Worker criticalf!($($args),*) 319*61c4878aSAndroid Build Coastguard Worker }} 320*61c4878aSAndroid Build Coastguard Worker } 321*61c4878aSAndroid Build Coastguard Worker 322*61c4878aSAndroid Build Coastguard Worker /// Emit a fatal level log message using `core::fmt` format string semantics. 323*61c4878aSAndroid Build Coastguard Worker /// 324*61c4878aSAndroid Build Coastguard Worker /// *Note*: `fatal` only emits a log message and does not cause a `panic!()` 325*61c4878aSAndroid Build Coastguard Worker /// 326*61c4878aSAndroid Build Coastguard Worker /// ``` 327*61c4878aSAndroid Build Coastguard Worker /// use pw_log::fatal; 328*61c4878aSAndroid Build Coastguard Worker /// 329*61c4878aSAndroid Build Coastguard Worker /// fatal!("Log Fact: All out of log facts! Timber!"); 330*61c4878aSAndroid Build Coastguard Worker /// ``` 331*61c4878aSAndroid Build Coastguard Worker #[macro_export] 332*61c4878aSAndroid Build Coastguard Worker macro_rules! fatal { 333*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 334*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 335*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::log!(__pw_log_crate::LogLevel::Fatal, $($args),*) 336*61c4878aSAndroid Build Coastguard Worker }}; 337*61c4878aSAndroid Build Coastguard Worker } 338*61c4878aSAndroid Build Coastguard Worker 339*61c4878aSAndroid Build Coastguard Worker /// Emit a fatal level log message using `printf` format string semantics. 340*61c4878aSAndroid Build Coastguard Worker /// 341*61c4878aSAndroid Build Coastguard Worker /// *Note*: `fatalf` only emits a log message and does not cause a `panic!()` 342*61c4878aSAndroid Build Coastguard Worker /// 343*61c4878aSAndroid Build Coastguard Worker /// ``` 344*61c4878aSAndroid Build Coastguard Worker /// use pw_log::{fatalf, LogLevel}; 345*61c4878aSAndroid Build Coastguard Worker /// 346*61c4878aSAndroid Build Coastguard Worker /// fatalf!("Log Fact: All out of log facts! Timber!"); 347*61c4878aSAndroid Build Coastguard Worker /// ``` 348*61c4878aSAndroid Build Coastguard Worker #[macro_export] 349*61c4878aSAndroid Build Coastguard Worker macro_rules! fatalf { 350*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 351*61c4878aSAndroid Build Coastguard Worker use $crate::__private as __pw_log_crate; 352*61c4878aSAndroid Build Coastguard Worker __pw_log_crate::logf!(__pw_log_crate::LogLevel::Fatal, $($args),*) 353*61c4878aSAndroid Build Coastguard Worker }}; 354*61c4878aSAndroid Build Coastguard Worker } 355*61c4878aSAndroid Build Coastguard Worker 356*61c4878aSAndroid Build Coastguard Worker /// Deprecated alias for [`fatalf!`]. 357*61c4878aSAndroid Build Coastguard Worker #[macro_export] 358*61c4878aSAndroid Build Coastguard Worker macro_rules! pw_log_fatalf { 359*61c4878aSAndroid Build Coastguard Worker ($($args:expr),*) => {{ 360*61c4878aSAndroid Build Coastguard Worker fatalf!($($args),*) 361*61c4878aSAndroid Build Coastguard Worker }} 362*61c4878aSAndroid Build Coastguard Worker } 363*61c4878aSAndroid Build Coastguard Worker 364*61c4878aSAndroid Build Coastguard Worker #[cfg(test)] 365*61c4878aSAndroid Build Coastguard Worker mod tests { 366*61c4878aSAndroid Build Coastguard Worker // TODO(b/311262163): Add infrastructure for testing behavior of `pw_log` API. 367*61c4878aSAndroid Build Coastguard Worker // The syntax of that API is verified through doctests. 368*61c4878aSAndroid Build Coastguard Worker } 369