sfo_log/
lib.rs

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 / target / parent.
13    (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 / target.
25    (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 / parent.
37    (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 / parent.
49    (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.
61    (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.
73    (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.
85    (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    // ...
103    ({ $($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 / target / parent.
131    (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 / target.
143    (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 / parent.
155    (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 / parent.
167    (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.
179    (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.
191    (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.
203    (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    // ...
221    ({ $($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 / target / parent.
249    (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 / target.
261    (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 / parent.
273    (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 / parent.
285    (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.
297    (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.
309    (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.
321    (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    // ...
339    ({ $($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 / target / parent.
367    (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 / target.
379    (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 / parent.
391    (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 / parent.
403    (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.
415    (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.
427    (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.
439    (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    // ...
457    ({ $($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 / target / parent.
486    (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 / target.
498    (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 / parent.
510    (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 / parent.
522    (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.
534    (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.
546    (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.
558    (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    // ...
576    ({ $($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), // 文件大小达到 10MB 时轮转
697                        Naming::Numbers, // 使用数字命名轮转文件
698                        Cleanup::KeepLogFiles(self.log_file_count), // 保留最近 7 个日志文件
699                );
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}