Line data Source code
1 : //! LIEF's logging API
2 : //!
3 : //! This module contains function to tweak or use LIEF's logging mechanisms
4 : //!
5 : //!
6 : //! ```
7 : //! use lief::logging;
8 : //!
9 : //! logging::set_level(logging::Level::DEBUG);
10 : //! logging::log(logging::Level::DEBUG, "Hi!");
11 : //! ```
12 :
13 : use lief_ffi as ffi;
14 :
15 : use std::path::Path;
16 : use std::convert::{From, Into};
17 :
18 : #[allow(non_camel_case_types)]
19 0 : #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
20 : /// The different levels of log
21 : pub enum Level {
22 : OFF,
23 : TRACE,
24 : DEBUG,
25 : INFO,
26 : WARN,
27 : ERR,
28 : CRITICAL,
29 : UNKNOWN(u32),
30 : }
31 :
32 : impl From<u32> for Level {
33 0 : fn from(value: u32) -> Self {
34 0 : match value {
35 0 : 0x00000000 => Level::OFF,
36 0 : 0x00000001 => Level::TRACE,
37 0 : 0x00000002 => Level::DEBUG,
38 0 : 0x00000003 => Level::INFO,
39 0 : 0x00000004 => Level::WARN,
40 0 : 0x00000005 => Level::ERR,
41 0 : 0x00000006 => Level::CRITICAL,
42 0 : _ => Level::UNKNOWN(value),
43 : }
44 0 : }
45 : }
46 :
47 : impl From<Level> for u32 {
48 72 : fn from(value: Level) -> Self {
49 72 : match value {
50 0 : Level::OFF => 0x00000000,
51 0 : Level::TRACE => 0x00000001,
52 24 : Level::DEBUG => 0x00000002,
53 24 : Level::INFO => 0x00000003,
54 12 : Level::WARN => 0x00000004,
55 12 : Level::ERR => 0x00000005,
56 0 : Level::CRITICAL => 0x00000006,
57 0 : Level::UNKNOWN(_) => 0x00000003, // INFO
58 : }
59 72 : }
60 : }
61 :
62 : /// Reset the current logger
63 12 : pub fn reset() {
64 12 : ffi::LIEF_Logging::reset()
65 12 : }
66 :
67 : /// Prevent any log message from being printed
68 12 : pub fn disable() {
69 12 : ffi::LIEF_Logging::disable()
70 12 : }
71 :
72 : /// Enable the logger
73 12 : pub fn enable() {
74 12 : ffi::LIEF_Logging::enable()
75 12 : }
76 :
77 : /// Change the logging level
78 : ///
79 : /// ```
80 : /// set_level(Level::INFO)
81 : /// ```
82 12 : pub fn set_level(level: Level) {
83 12 : ffi::LIEF_Logging::set_level(level.into())
84 12 : }
85 : /// Switch to a file-based logger (instead of stderr-based)
86 : ///
87 : /// ```
88 : /// let mut tmp = env::temp_dir();
89 : /// tmp.push("lief_log.log");
90 : /// logging::set_path(dir.as_path());
91 : /// ```
92 5 : pub fn set_path<P: AsRef<Path>>(path: P) {
93 5 : ffi::LIEF_Logging::set_path(path.as_ref().to_str().expect("Can't convert into string"))
94 5 : }
95 :
96 : /// Log a message with the logger
97 60 : pub fn log(level: Level, message: &str) {
98 60 : ffi::LIEF_Logging::log(level.into(), message)
99 60 : }
100 :
101 : #[doc(hidden)]
102 : #[macro_export]
103 : macro_rules! __lief_log {
104 : ($level: expr) => {
105 : lief::logging::log($level, "")
106 : };
107 : ($level: expr, $($arg:tt)*) => {{
108 : lief::logging::log($level, &format!($($arg)*));
109 : }};
110 : }
111 :
112 : #[macro_export]
113 : macro_rules! log_dbg {
114 : ($($args:tt)*) => {
115 : $crate::__lief_log!(lief::logging::Level::DEBUG, $($args)*)
116 : };
117 : }
118 :
119 : #[macro_export]
120 : macro_rules! log_info {
121 : ($($args:tt)*) => {
122 : $crate::__lief_log!(lief::logging::Level::INFO, $($args)*)
123 : };
124 : }
125 :
126 : #[macro_export]
127 : macro_rules! log_warn {
128 : ($($args:tt)*) => {
129 : $crate::__lief_log!(lief::logging::Level::WARN, $($args)*)
130 : };
131 : }
132 :
133 : #[macro_export]
134 : macro_rules! log_err {
135 : ($($args:tt)*) => {
136 : $crate::__lief_log!(lief::logging::Level::ERR, $($args)*)
137 : };
138 : }
139 :
|