1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use Once;
use ;
pub use tracing_log;
static INIT: Once = new;
///
cfg_tracing_appender!
pub use tracing_subscriber as subscriber;
/// # Examples
///```rust
/// // e_log = {version="0.2", features=["tracing","panic","dialog","tracing-appender","tracing-subscriber"]}
/// // e_utils = "0.3"
/// fn main() -> e_utils::Result<()> {
/// use e_log::appender::non_blocking::WorkerGuard;
/// use e_log::subscriber::layer::SubscriberExt as _;
/// use e_log::subscriber::{self, Registry};
/// use e_log::{appender, init_subscriber};
/// use e_log::{preload::*, Level, __private::subscriber::Subscriber};
/// use e_utils::parse::AutoPath as _;
/// use std::env::current_dir;
/// use std::path::Path;
/// use tracing_subscriber::fmt::time::ChronoUtc;
/// /// Compose multiple layers into a `tracing`'s subscriber.
/// pub fn get_subscriber(
/// folder: impl AsRef<Path>,
/// fname: impl AsRef<Path>,
/// level: Level,
/// ) -> (impl Subscriber + Send + Sync, Vec<WorkerGuard>) {
/// let roll = appender::rolling::daily(folder, fname, e_log::FileShare::Read);
/// let (f, guard) = appender::non_blocking(roll);
/// let (f2, guard2) = appender::non_blocking(std::io::stdout());
/// let file_layer = subscriber::fmt::layer()
/// .with_ansi(false)
/// .with_target(true)
/// .with_writer(f);
/// let timer = ChronoUtc::new("[%F %H:%M:%S]".to_owned());
/// let base_layer = subscriber::fmt::layer()
/// .with_timer(timer)
/// .with_ansi(false)
/// .with_target(true)
/// .with_writer(f2);
/// let def = Registry::default()
/// .with(level.to_level_filter())
/// .with(base_layer)
/// .with(file_layer);
/// (def, vec![guard, guard2])
/// }
/// fn init(fpath: impl AsRef<Path>, sub: impl Subscriber + Send + Sync) -> e_utils::Result<()> {
/// e_log::panic::reattach_windows_terminal();
/// e_log::panic::set_panic_hook(fpath)?;
/// init_subscriber(sub, false);
/// Ok(())
/// }
/// let folder = current_dir().unwrap().join("test");
/// folder.auto_create_dir()?;
/// let (subscriber, _guards) = get_subscriber(&folder, "test.log", Level::Info);
/// init(folder.join("bug.test.log"), subscriber)?;
/// info!("info");
/// debug!("debug");
/// error!("error");
/// trace!("trace");
/// warn!("warn");
/// info_box("测试", "INFO");
/// // BUG弹窗
/// assert_eq!("BUG", "???");
/// Ok(())
/// }
///```