1#[macro_export]
17macro_rules! log {
18 (target: $target:expr, $lvl:expr, $($arg:tt)+) => {{
20 $crate::tracing::event!(target: $target, $lvl, $($arg)+)
21 }};
22
23 ($lvl:expr, $($arg:tt)+) => {{
25 $crate::tracing::event!($lvl, $($arg)+)
26 }};
27}
28
29#[macro_export]
31macro_rules! error {
32 (target: $target:expr, $($arg:tt)+) => ({
34 $crate::log!(target: $target, $crate::tracing::Level::ERROR, $($arg)+)
35 });
36
37 ($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 (%$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 ($e:expr; $($arg:tt)+) => ({
59 $crate::log!(
60 $crate::tracing::Level::ERROR,
61 err = ?$e,
62 $($arg)+
63 )
64 });
65
66 (%$e:expr; $($arg:tt)+) => ({
68 $crate::log!(
69 $crate::tracing::Level::ERROR,
70 err = %$e,
71 $($arg)+
72 )
73 });
74
75 ($($arg:tt)+) => ({
77 $crate::log!($crate::tracing::Level::ERROR, $($arg)+)
78 });
79}
80
81#[macro_export]
83macro_rules! warn {
84 (target: $target:expr, $($arg:tt)+) => {
86 $crate::log!(target: $target, $crate::tracing::Level::WARN, $($arg)+)
87 };
88
89 ($e:expr; $($arg:tt)+) => ({
91 $crate::log!(
92 $crate::tracing::Level::WARN,
93 err = ?$e,
94 $($arg)+
95 )
96 });
97
98 (%$e:expr; $($arg:tt)+) => ({
100 $crate::log!(
101 $crate::tracing::Level::WARN,
102 err = %$e,
103 $($arg)+
104 )
105 });
106
107 ($($arg:tt)+) => {
109 $crate::log!($crate::tracing::Level::WARN, $($arg)+)
110 };
111}
112
113#[macro_export]
115macro_rules! info {
116 (target: $target:expr, $($arg:tt)+) => {
118 $crate::log!(target: $target, $crate::tracing::Level::INFO, $($arg)+)
119 };
120
121 ($($arg:tt)+) => {
123 $crate::log!($crate::tracing::Level::INFO, $($arg)+)
124 };
125}
126
127#[macro_export]
129macro_rules! debug {
130 (target: $target:expr, $($arg:tt)+) => {
132 $crate::log!(target: $target, $crate::tracing::Level::DEBUG, $($arg)+)
133 };
134
135 ($($arg:tt)+) => {
137 $crate::log!($crate::tracing::Level::DEBUG, $($arg)+)
138 };
139}
140
141#[macro_export]
143macro_rules! trace {
144 (target: $target:expr, $($arg:tt)+) => {
146 $crate::log!(target: $target, $crate::tracing::Level::TRACE, $($arg)+)
147 };
148
149 ($($arg:tt)+) => {
151 $crate::log!($crate::tracing::Level::TRACE, $($arg)+)
152 };
153}
154
155#[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 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}