1use std::path::{Path, PathBuf};
2use std::thread;
3#[cfg(feature = "_log")]
4use flexi_logger::{Cleanup, Criterion, DeferredNow, Duplicate, FileSpec, FlexiLoggerError, Naming, Record};
5
6#[cfg(all(feature = "_log", not(feature = "nolog")))]
7pub use tracing::{info, warn, trace, debug, error};
8
9#[cfg(feature = "nolog")]
10#[macro_export]
11macro_rules! error {
12 (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
14 );
15 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
16 );
17 (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
18 );
19 (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
20 );
21 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
22 );
23
24 (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
26 );
27 (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
28 );
29 (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
30 );
31 (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
32 );
33 (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
34 );
35
36 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
38 );
39 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
40 );
41 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
42 );
43 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
44 );
45 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
46 );
47
48 (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
50 );
51 (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
52 );
53 (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
54 );
55 (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
56 );
57 (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
58 );
59
60 (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
62 );
63 (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
64 );
65 (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
66 );
67 (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
68 );
69 (name: $name:expr, $($arg:tt)+ ) => (
70 );
71
72 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
74 );
75 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
76 );
77 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
78 );
79 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
80 );
81 (target: $target:expr, $($arg:tt)+ ) => (
82 );
83
84 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
86 );
87 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
88 );
89 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
90 );
91 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
92 );
93 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
94 );
95 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
96 );
97 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
98 );
99 (parent: $parent:expr, $($arg:tt)+) => (
100 );
101
102 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
104 );
105 ($($k:ident).+ = $($field:tt)*) => (
106 );
107 (?$($k:ident).+ = $($field:tt)*) => (
108 );
109 (%$($k:ident).+ = $($field:tt)*) => (
110 );
111 ($($k:ident).+, $($field:tt)*) => (
112 );
113 (?$($k:ident).+, $($field:tt)*) => (
114 );
115 (%$($k:ident).+, $($field:tt)*) => (
116 );
117 (?$($k:ident).+) => (
118 );
119 (%$($k:ident).+) => (
120 );
121 ($($k:ident).+) => (
122 );
123 ($($arg:tt)+) => (
124 );
125}
126
127#[cfg(feature = "nolog")]
128#[macro_export]
129macro_rules! debug {
130 (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
132 );
133 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
134 );
135 (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
136 );
137 (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
138 );
139 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
140 );
141
142 (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
144 );
145 (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
146 );
147 (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
148 );
149 (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
150 );
151 (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
152 );
153
154 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
156 );
157 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
158 );
159 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
160 );
161 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
162 );
163 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
164 );
165
166 (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
168 );
169 (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
170 );
171 (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
172 );
173 (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
174 );
175 (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
176 );
177
178 (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
180 );
181 (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
182 );
183 (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
184 );
185 (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
186 );
187 (name: $name:expr, $($arg:tt)+ ) => (
188 );
189
190 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
192 );
193 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
194 );
195 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
196 );
197 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
198 );
199 (target: $target:expr, $($arg:tt)+ ) => (
200 );
201
202 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
204 );
205 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
206 );
207 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
208 );
209 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
210 );
211 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
212 );
213 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
214 );
215 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
216 );
217 (parent: $parent:expr, $($arg:tt)+) => (
218 );
219
220 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
222 );
223 ($($k:ident).+ = $($field:tt)*) => (
224 );
225 (?$($k:ident).+ = $($field:tt)*) => (
226 );
227 (%$($k:ident).+ = $($field:tt)*) => (
228 );
229 ($($k:ident).+, $($field:tt)*) => (
230 );
231 (?$($k:ident).+, $($field:tt)*) => (
232 );
233 (%$($k:ident).+, $($field:tt)*) => (
234 );
235 (?$($k:ident).+) => (
236 );
237 (%$($k:ident).+) => (
238 );
239 ($($k:ident).+) => (
240 );
241 ($($arg:tt)+) => (
242 );
243}
244
245#[cfg(feature = "nolog")]
246#[macro_export]
247macro_rules! trace {
248 (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
250 );
251 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
252 );
253 (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
254 );
255 (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
256 );
257 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
258 );
259
260 (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
262 );
263 (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
264 );
265 (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
266 );
267 (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
268 );
269 (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
270 );
271
272 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
274 );
275 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
276 );
277 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
278 );
279 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
280 );
281 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
282 );
283
284 (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
286 );
287 (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
288 );
289 (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
290 );
291 (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
292 );
293 (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
294 );
295
296 (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
298 );
299 (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
300 );
301 (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
302 );
303 (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
304 );
305 (name: $name:expr, $($arg:tt)+ ) => (
306 );
307
308 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
310 );
311 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
312 );
313 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
314 );
315 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
316 );
317 (target: $target:expr, $($arg:tt)+ ) => (
318 );
319
320 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
322 );
323 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
324 );
325 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
326 );
327 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
328 );
329 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
330 );
331 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
332 );
333 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
334 );
335 (parent: $parent:expr, $($arg:tt)+) => (
336 );
337
338 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
340 );
341 ($($k:ident).+ = $($field:tt)*) => (
342 );
343 (?$($k:ident).+ = $($field:tt)*) => (
344 );
345 (%$($k:ident).+ = $($field:tt)*) => (
346 );
347 ($($k:ident).+, $($field:tt)*) => (
348 );
349 (?$($k:ident).+, $($field:tt)*) => (
350 );
351 (%$($k:ident).+, $($field:tt)*) => (
352 );
353 (?$($k:ident).+) => (
354 );
355 (%$($k:ident).+) => (
356 );
357 ($($k:ident).+) => (
358 );
359 ($($arg:tt)+) => (
360 );
361}
362
363#[cfg(feature = "nolog")]
364#[macro_export]
365macro_rules! info {
366 (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
368 );
369 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
370 );
371 (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
372 );
373 (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
374 );
375 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
376 );
377
378 (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
380 );
381 (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
382 );
383 (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
384 );
385 (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
386 );
387 (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
388 );
389
390 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
392 );
393 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
394 );
395 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
396 );
397 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
398 );
399 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
400 );
401
402 (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
404 );
405 (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
406 );
407 (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
408 );
409 (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
410 );
411 (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
412 );
413
414 (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
416 );
417 (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
418 );
419 (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
420 );
421 (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
422 );
423 (name: $name:expr, $($arg:tt)+ ) => (
424 );
425
426 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
428 );
429 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
430 );
431 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
432 );
433 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
434 );
435 (target: $target:expr, $($arg:tt)+ ) => (
436 );
437
438 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
440 );
441 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
442 );
443 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
444 );
445 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
446 );
447 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
448 );
449 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
450 );
451 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
452 );
453 (parent: $parent:expr, $($arg:tt)+) => (
454 );
455
456 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
458 );
459 ($($k:ident).+ = $($field:tt)*) => (
460 );
461 (?$($k:ident).+ = $($field:tt)*) => (
462 );
463 (%$($k:ident).+ = $($field:tt)*) => (
464 );
465 ($($k:ident).+, $($field:tt)*) => (
466 );
467 (?$($k:ident).+, $($field:tt)*) => (
468 );
469 (%$($k:ident).+, $($field:tt)*) => (
470 );
471 (?$($k:ident).+) => (
472 );
473 (%$($k:ident).+) => (
474 );
475 ($($k:ident).+) => (
476 );
477 ($($arg:tt)+) => (
478 );
479}
480
481
482#[cfg(feature = "nolog")]
483#[macro_export]
484macro_rules! warn {
485 (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
487 );
488 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
489 );
490 (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
491 );
492 (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
493 );
494 (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
495 );
496
497 (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
499 );
500 (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
501 );
502 (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
503 );
504 (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
505 );
506 (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
507 );
508
509 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
511 );
512 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
513 );
514 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
515 );
516 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
517 );
518 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
519 );
520
521 (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
523 );
524 (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
525 );
526 (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
527 );
528 (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
529 );
530 (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
531 );
532
533 (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
535 );
536 (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
537 );
538 (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
539 );
540 (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
541 );
542 (name: $name:expr, $($arg:tt)+ ) => (
543 );
544
545 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
547 );
548 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
549 );
550 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
551 );
552 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
553 );
554 (target: $target:expr, $($arg:tt)+ ) => (
555 );
556
557 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
559 );
560 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
561 );
562 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
563 );
564 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
565 );
566 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
567 );
568 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
569 );
570 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
571 );
572 (parent: $parent:expr, $($arg:tt)+) => (
573 );
574
575 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
577 );
578 ($($k:ident).+ = $($field:tt)*) => (
579 );
580 (?$($k:ident).+ = $($field:tt)*) => (
581 );
582 (%$($k:ident).+ = $($field:tt)*) => (
583 );
584 ($($k:ident).+, $($field:tt)*) => (
585 );
586 (?$($k:ident).+, $($field:tt)*) => (
587 );
588 (%$($k:ident).+, $($field:tt)*) => (
589 );
590 (?$($k:ident).+) => (
591 );
592 (%$($k:ident).+) => (
593 );
594 ($($k:ident).+) => (
595 );
596 ($($arg:tt)+) => (
597 );
598}
599
600
601#[cfg(feature = "_log")]
602fn custom_format(writer: &mut dyn std::io::Write, now: &mut DeferredNow, record: &Record) -> std::io::Result<()> {
603 let file = match record.file() {
604 None => {
605 "<unknown>".to_string()
606 }
607 Some(path) => {
608 Path::new(path).file_name().map(|v| v.to_string_lossy().to_string()).unwrap_or("<unknown>".to_string())
609 }
610 };
611 write!(
612 writer,
613 "{} [{}] [{}:{}] [{}] - {}",
614 now.format("%Y-%m-%d %H:%M:%S"),
615 record.level(),
616 file,
617 record.line().unwrap_or(0),
618 thread::current().name().unwrap_or(format!("{:?}", thread::current().id()).as_str()),
619 &record.args()
620 )
621}
622pub struct Logger {
623 app_name: String,
624 log_level: String,
625 log_to_file: bool,
626 log_path: PathBuf,
627 log_file_size: u64,
628 log_file_count: usize,
629 instance_id: String,
630 output_console: bool,
631}
632
633impl Logger {
634 pub fn new(app_name: &str) -> Self {
635 Self {
636 app_name: app_name.to_string(),
637 log_level: "info".to_string(),
638 log_to_file: false,
639 log_path: std::env::current_dir().unwrap().join("logs"),
640 log_file_size: 10 * 1024 * 1024,
641 log_file_count: 10,
642 instance_id: "".to_string(),
643 output_console: true,
644 }
645 }
646
647 pub fn set_instance_id(mut self, instance_id: &str) -> Self {
648 self.instance_id = instance_id.to_string();
649 self
650 }
651
652 pub fn set_process_id_to_instance_id(mut self) -> Self {
653 self.instance_id = format!("{}", std::process::id());
654 self
655 }
656
657 pub fn set_log_level(mut self, level: &str) -> Self {
658 self.log_level = level.to_string();
659 self
660 }
661
662 pub fn set_log_to_file(mut self, to_file: bool) -> Self {
663 self.log_to_file = to_file;
664 self
665 }
666
667 pub fn set_log_path(mut self, path: &str) -> Self {
668 self.log_path = PathBuf::from(path);
669 self
670 }
671
672 pub fn set_log_file_size(mut self, size: u64) -> Self {
673 self.log_file_size = size;
674 self
675 }
676
677 pub fn set_log_file_count(mut self, count: usize) -> Self {
678 self.log_file_count = count;
679 self
680 }
681
682 pub fn set_output_to_console(mut self, output_console: bool) -> Self {
683 self.output_console = output_console;
684 self
685 }
686
687 #[cfg(not(feature = "nolog"))]
688 pub fn start(&self) -> Result<(), FlexiLoggerError> {
689 let mut logger = flexi_logger::Logger::try_with_env_or_str(self.log_level.as_str())?;
690 if self.log_to_file {
691 let mut base_name = self.app_name.clone();
692 if !self.instance_id.is_empty() {
693 base_name = format!("{}_{}", self.app_name, self.instance_id);
694 }
695 logger = logger.log_to_file(FileSpec::default().directory(self.log_path.as_path()).basename(base_name.as_str()))
696 .rotate(Criterion::Size(self.log_file_size), Naming::Numbers, Cleanup::KeepLogFiles(self.log_file_count), );
700 }
701 if !self.output_console {
702 logger = logger.duplicate_to_stderr(Duplicate::None);
703 } else {
704 logger = logger.duplicate_to_stderr(Duplicate::All);
705 }
706 logger.format(custom_format)
707 .start()?;
708 Ok(())
709 }
710
711 #[cfg(feature = "nolog")]
712 pub fn start(&self) -> Result<(), FlexiLoggerError> {
713 Ok(())
714 }
715}