kaspa_core/log/
mod.rs

1//! Logger and logging macros
2//!
3//! For the macros to properly compile, the calling crate must add a dependency to
4//! crate log (ie. `log.workspace = true`) when target architecture is not wasm32.
5
6#[allow(unused_imports)]
7pub use log::{Level, LevelFilter};
8pub use workflow_log;
9
10cfg_if::cfg_if! {
11    if #[cfg(not(target_arch = "wasm32"))] {
12        use consts::*;
13
14        mod appender;
15        mod consts;
16        mod logger;
17    }
18}
19
20pub fn set_log_level(level: LevelFilter) {
21    workflow_log::set_log_level(level);
22}
23
24#[cfg(not(target_arch = "wasm32"))]
25pub fn init_logger(log_dir: Option<&str>, filters: &str) {
26    use crate::log::appender::AppenderSpec;
27    use log4rs::{config::Root, Config};
28    use std::iter::once;
29
30    const CONSOLE_APPENDER: &str = "stdout";
31    const LOG_FILE_APPENDER: &str = "log_file";
32    const ERR_LOG_FILE_APPENDER: &str = "err_log_file";
33
34    let level = LevelFilter::Info;
35    let loggers = logger::Builder::new().root_level(level).parse_env(DEFAULT_LOGGER_ENV).parse_expression(filters).build();
36
37    let mut stdout_appender = AppenderSpec::console(CONSOLE_APPENDER, None);
38    let mut file_appender = log_dir.map(|x| AppenderSpec::roller(LOG_FILE_APPENDER, None, x, LOG_FILE_NAME));
39    let mut err_file_appender =
40        log_dir.map(|x| AppenderSpec::roller(ERR_LOG_FILE_APPENDER, Some(LevelFilter::Warn), x, ERR_LOG_FILE_NAME));
41    let appenders = once(&mut stdout_appender).chain(&mut file_appender).chain(&mut err_file_appender).map(|x| x.appender());
42
43    let config = Config::builder()
44        .appenders(appenders)
45        .loggers(loggers.items())
46        .build(
47            Root::builder()
48                .appenders(once(&stdout_appender).chain(&file_appender).chain(&err_file_appender).map(|x| x.name))
49                .build(loggers.root_level()),
50        )
51        .unwrap();
52
53    let _handle = log4rs::init_config(config).unwrap();
54
55    set_log_level(level);
56}
57
58/// Tries to init the global logger, but does not panic if it was already setup.
59/// Should be used for tests.
60#[cfg(not(target_arch = "wasm32"))]
61pub fn try_init_logger(filters: &str) {
62    use crate::log::appender::AppenderSpec;
63    use log4rs::{config::Root, Config};
64
65    const CONSOLE_APPENDER: &str = "stdout";
66
67    let loggers = logger::Builder::new().root_level(LevelFilter::Info).parse_env(DEFAULT_LOGGER_ENV).parse_expression(filters).build();
68    let mut stdout_appender = AppenderSpec::console(CONSOLE_APPENDER, None);
69    let config = Config::builder()
70        .appender(stdout_appender.appender())
71        .loggers(loggers.items())
72        .build(Root::builder().appender(CONSOLE_APPENDER).build(loggers.root_level()))
73        .unwrap();
74    let _ = log4rs::init_config(config);
75}
76
77#[cfg(target_arch = "wasm32")]
78#[macro_export]
79macro_rules! trace {
80    ($($t:tt)*) => {
81        if kaspa_core::log::workflow_log::log_level_enabled(log::Level::Trace) {
82            kaspa_core::log::workflow_log::impls::trace_impl(None, &format_args!($($t)*));
83        }
84    };
85}
86
87#[cfg(not(target_arch = "wasm32"))]
88#[macro_export]
89macro_rules! trace {
90    ($($t:tt)*) => {
91        log::trace!($($t)*);
92    };
93}
94
95#[cfg(target_arch = "wasm32")]
96#[macro_export]
97macro_rules! debug {
98    ($($t:tt)*) => (
99        if kaspa_core::log::workflow_log::log_level_enabled(log::Level::Debug) {
100            kaspa_core::log::workflow_log::impls::debug_impl(None, &format_args!($($t)*));
101        }
102    )
103}
104
105#[cfg(not(target_arch = "wasm32"))]
106#[macro_export]
107macro_rules! debug {
108    ($($t:tt)*) => (
109        log::debug!($($t)*);
110    )
111}
112
113#[cfg(target_arch = "wasm32")]
114#[macro_export]
115macro_rules! info {
116    ($($t:tt)*) => (
117        if kaspa_core::log::workflow_log::log_level_enabled(log::Level::Info) {
118            kaspa_core::log::workflow_log::impls::info_impl(None, &format_args!($($t)*));
119        }
120    )
121}
122
123#[cfg(not(target_arch = "wasm32"))]
124#[macro_export]
125macro_rules! info {
126    ($($t:tt)*) => (
127        log::info!($($t)*);
128    )
129}
130
131#[cfg(target_arch = "wasm32")]
132#[macro_export]
133macro_rules! warn {
134    ($($t:tt)*) => (
135        if kaspa_core::log::workflow_log::log_level_enabled(log::Level::Warn) {
136            kaspa_core::log::workflow_log::impls::warn_impl(None, &format_args!($($t)*));
137        }
138    )
139}
140
141#[cfg(not(target_arch = "wasm32"))]
142#[macro_export]
143macro_rules! warn {
144    ($($t:tt)*) => (
145        log::warn!($($t)*);
146    )
147}
148
149#[cfg(target_arch = "wasm32")]
150#[macro_export]
151macro_rules! error {
152    ($($t:tt)*) => (
153        if kaspa_core::log::workflow_log::log_level_enabled(log::Level::Error) {
154            kaspa_core::log::workflow_log::impls::error_impl(None, &format_args!($($t)*));
155        }
156    )
157}
158
159#[cfg(not(target_arch = "wasm32"))]
160#[macro_export]
161macro_rules! error {
162    ($($t:tt)*) => (
163        log::error!($($t)*);
164    )
165}