Skip to main content

common_telemetry/
macros.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/// The standard logging macro.
16#[macro_export]
17macro_rules! log {
18    // log!(target: "my_target", Level::INFO, "a {} event", "log");
19    (target: $target:expr, $lvl:expr, $($arg:tt)+) => {{
20        $crate::tracing::event!(target: $target, $lvl, $($arg)+)
21    }};
22
23    // log!(Level::INFO, "a log event")
24    ($lvl:expr, $($arg:tt)+) => {{
25        $crate::tracing::event!($lvl, $($arg)+)
26    }};
27}
28
29/// Logs a message at the error level.
30#[macro_export]
31macro_rules! error {
32    // error!(target: "my_target", "a {} event", "log")
33    (target: $target:expr, $($arg:tt)+) => ({
34        $crate::log!(target: $target, $crate::tracing::Level::ERROR, $($arg)+)
35    });
36
37    // error!(e; target: "my_target", "a {} event", "log")
38    ($e:expr; target: $target:expr, $($arg:tt)+) => ({
39        $crate::log!(
40            target: $target,
41            $crate::tracing::Level::ERROR,
42            err = ?$e,
43            $($arg)+
44        )
45    });
46
47    // error!(%e; target: "my_target", "a {} event", "log")
48    (%$e:expr; target: $target:expr, $($arg:tt)+) => ({
49        $crate::log!(
50            target: $target,
51            $crate::tracing::Level::ERROR,
52            err = %$e,
53            $($arg)+
54        )
55    });
56
57    // error!(e; "a {} event", "log")
58    ($e:expr; $($arg:tt)+) => ({
59        $crate::log!(
60            $crate::tracing::Level::ERROR,
61            err = ?$e,
62            $($arg)+
63        )
64    });
65
66    // error!(%e; "a {} event", "log")
67    (%$e:expr; $($arg:tt)+) => ({
68        $crate::log!(
69            $crate::tracing::Level::ERROR,
70            err = %$e,
71            $($arg)+
72        )
73    });
74
75    // error!("a {} event", "log")
76    ($($arg:tt)+) => ({
77        $crate::log!($crate::tracing::Level::ERROR, $($arg)+)
78    });
79}
80
81/// Logs a message at the warn level.
82#[macro_export]
83macro_rules! warn {
84    // warn!(target: "my_target", "a {} event", "log")
85    (target: $target:expr, $($arg:tt)+) => {
86        $crate::log!(target: $target, $crate::tracing::Level::WARN, $($arg)+)
87    };
88
89    // warn!(e; "a {} event", "log")
90    ($e:expr; $($arg:tt)+) => ({
91        $crate::log!(
92            $crate::tracing::Level::WARN,
93            err = ?$e,
94            $($arg)+
95        )
96    });
97
98    // warn!(%e; "a {} event", "log")
99    (%$e:expr; $($arg:tt)+) => ({
100        $crate::log!(
101            $crate::tracing::Level::WARN,
102            err = %$e,
103            $($arg)+
104        )
105    });
106
107    // warn!("a {} event", "log")
108    ($($arg:tt)+) => {
109        $crate::log!($crate::tracing::Level::WARN, $($arg)+)
110    };
111}
112
113/// Logs a message at the info level.
114#[macro_export]
115macro_rules! info {
116    // info!(target: "my_target", "a {} event", "log")
117    (target: $target:expr, $($arg:tt)+) => {
118        $crate::log!(target: $target, $crate::tracing::Level::INFO, $($arg)+)
119    };
120
121    // info!("a {} event", "log")
122    ($($arg:tt)+) => {
123        $crate::log!($crate::tracing::Level::INFO, $($arg)+)
124    };
125}
126
127/// Logs a message at the debug level.
128#[macro_export]
129macro_rules! debug {
130    // debug!(target: "my_target", "a {} event", "log")
131    (target: $target:expr, $($arg:tt)+) => {
132        $crate::log!(target: $target, $crate::tracing::Level::DEBUG, $($arg)+)
133    };
134
135    // debug!("a {} event", "log")
136    ($($arg:tt)+) => {
137        $crate::log!($crate::tracing::Level::DEBUG, $($arg)+)
138    };
139}
140
141/// Logs a message at the trace level.
142#[macro_export]
143macro_rules! trace {
144    // trace!(target: "my_target", "a {} event", "log")
145    (target: $target:expr, $($arg:tt)+) => {
146        $crate::log!(target: $target, $crate::tracing::Level::TRACE, $($arg)+)
147    };
148
149    // trace!("a {} event", "log")
150    ($($arg:tt)+) => {
151        $crate::log!($crate::tracing::Level::TRACE, $($arg)+)
152    };
153}
154
155/// Records a slow query independently of the global log level.
156#[macro_export]
157macro_rules! slow {
158    (target: $target:expr, $($arg:tt)+) => {
159        if let Some(logger) = $crate::logging::SLOW_QUERY_LOGGER.get() {
160            $crate::tracing::dispatcher::with_default(logger, || {
161                $crate::log!(target: $target, $crate::tracing::Level::INFO, slow = true, $($arg)+)
162            });
163        }
164    };
165
166    ($($arg:tt)+) => {
167        $crate::slow!(target: module_path!(), $($arg)+)
168    };
169}
170
171#[cfg(test)]
172mod tests {
173    use common_error::mock::MockError;
174    use common_error::status_code::StatusCode;
175    use tracing::Level;
176
177    macro_rules! all_log_macros {
178        ($($arg:tt)*) => {
179            trace!($($arg)*);
180            debug!($($arg)*);
181            info!($($arg)*);
182            warn!($($arg)*);
183            error!($($arg)*);
184        };
185    }
186
187    #[test]
188    fn test_log_args() {
189        log!(target: "my_target", Level::TRACE, "foo");
190        log!(target: "my_target", Level::DEBUG, "foo",);
191
192        log!(target: "my_target", Level::INFO, "foo: {}", 3);
193        log!(target: "my_target", Level::WARN, "foo: {}", 3,);
194
195        log!(target: "my_target", Level::ERROR, "hello {world}", world = "world");
196        log!(target: "my_target", Level::DEBUG, "hello {world}", world = "world",);
197
198        all_log_macros!(target: "my_target", "foo");
199        all_log_macros!(target: "my_target", "foo",);
200
201        all_log_macros!(target: "my_target", "foo: {}", 3);
202        all_log_macros!(target: "my_target", "foo: {}", 3,);
203
204        all_log_macros!(target: "my_target", "hello {world}", world = "world");
205        all_log_macros!(target: "my_target", "hello {world}", world = "world",);
206    }
207
208    #[test]
209    fn test_log_no_target() {
210        log!(Level::DEBUG, "foo");
211        log!(Level::DEBUG, "foo: {}", 3);
212
213        all_log_macros!("foo");
214        all_log_macros!("foo: {}", 3);
215    }
216
217    #[test]
218    fn test_log_ref_scope_args() {
219        let bar = 35;
220        let world = "world";
221        log!(target: "my_target", Level::DEBUG, "bar: {bar}");
222        log!(target: "my_target", Level::DEBUG, "bar: {bar}, hello {}", world);
223        log!(target: "my_target", Level::DEBUG, "bar: {bar}, hello {world}",);
224
225        all_log_macros!(target: "my_target", "bar: {bar}");
226        all_log_macros!(target: "my_target", "bar: {bar}, hello {}", world);
227        all_log_macros!(target: "my_target", "bar: {bar}, hello {world}",);
228    }
229
230    #[test]
231    fn test_log_error() {
232        crate::init_default_ut_logging();
233
234        let err = MockError::new(StatusCode::Unknown);
235        let err_ref = &err;
236        let err_ref2 = &err_ref;
237
238        error!(target: "my_target", "hello {}", "world");
239        // Supports both owned and reference type.
240        error!(err; target: "my_target", "hello {}", "world");
241        error!(%err; target: "my_target", "hello {}", "world");
242        error!(err_ref; target: "my_target", "hello {}", "world");
243        error!(err_ref2; "hello {}", "world");
244        error!(%err_ref2; "hello {}", "world");
245        error!("hello {}", "world");
246
247        let root_err = MockError::with_source(err);
248        error!(root_err; "Error with source hello {}", "world");
249    }
250}