1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
//!Logging library, plain and simple. //! //!Simple logger. //! //!Minimal customization, builtin loggers: //! //!- Web - Uses console API; //!- Android Log; //!- C stdio - writes to stdout/stderr; //! //!## Features //! //!Note: all features must be used in binary code, not in library //! //!#### Loggers //! //!- `ufmt` - Enables [ufmt](https://github.com/japaric/ufmt) traits instead of core's `fmt` //!- `std` - Enables `std` usage, adding ability to use timestamps (not used in Web and Android) //!- `log` - Enables `log` usage, adding `log` logs to the output. //! //!#### Compile time macros //! //!- `level_error_off` - Disables `error!` in debug mode; //!- `level_warn_off` - Disables `warn!` in debug mode; //!- `level_info_off` - Disables `info!` in debug mode; //!- `level_debug_off` - Disables `debug!` in debug mode; //!- `level_trace_off` - Disables `trace!` in debug mode; //!- `level_all_off`- Disables all macros in debug mode; //! //!- `release_level_error_off` - Disables `error!` in release mode; //!- `release_level_warn_off` - Disables `warn!` in release mode; //!- `release_level_info_off` - Disables `info!` in release mode; //!- `release_level_debug_off` - Disables `debug!` in release mode; //!- `release_level_trace_off` - Disables `trace!` in release mode; //!- `release_level_all_off`- Disables all macros in release mode; #![warn(missing_docs)] #![no_std] #[cfg(feature = "log")] mod rust_log; #[cfg(all(feature = "std", not(any(all(target_arch = "wasm32", target_os = "unknown"), target_os = "android"))))] mod time; mod data; mod out; mod rt; #[doc(hidden)] pub use out::Out; #[cfg(feature = "ufmt")] mod ufmt; #[cfg(not(feature = "ufmt"))] mod cor; #[cfg(feature = "ufmt")] use crate::ufmt::derive::uDebug as Debug; use core::sync::atomic::{AtomicU8, Ordering}; static LEVEL: AtomicU8 = AtomicU8::new(0); ///Logging levels #[repr(u8)] #[derive(Copy, Eq, Debug)] pub enum Level { #[doc(hidden)] NONE = 0, /// Designates very serious errors. ERROR = 1, /// Designates hazardous situations. WARN, /// Designates useful information. INFO, /// Designates lower priority information. DEBUG, /// Designates very low priority, often extremely verbose, information. TRACE, } impl Clone for Level { #[inline] fn clone(&self) -> Self { *self } } impl PartialEq for Level { #[inline] fn eq(&self, other: &Self) -> bool { *self as u8 == *other as u8 } } ///Sets logging level pub fn set_level(level: Level) { rt::init(); LEVEL.store(level as u8, Ordering::Relaxed); #[cfg(feature = "log")] { rust_log::init(level.into()); } } #[inline] ///Checks if logging is enabled pub fn is_enabled(level: Level) -> bool { LEVEL.load(Ordering::Relaxed) >= level as u8 }