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
use crate::cfg::get_log_folder;
use backtrace::Backtrace;
use std::{cell::RefCell, io};
use tracing::Level;
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::{
    fmt::{writer::MakeWriterExt, Layer},
    prelude::*,
};
thread_local! {
    pub static BACKTRACE: RefCell<Option<Backtrace>> = const { RefCell::new(None) };
}
pub fn tracing_setup() -> WorkerGuard {
    let log_folder = get_log_folder().expect("no log folder");
    let file_appender = tracing_appender::rolling::daily(log_folder, "log");
    let (file_appender, guard_flush_file) = tracing_appender::non_blocking(file_appender);
    let file_appender = Layer::new()
        .with_writer(file_appender.with_max_level(Level::INFO))
        .with_line_number(true)
        .compact()
        .with_ansi(false)
        .with_file(true);
    let stdout = Layer::new()
        .with_writer(io::stdout.with_max_level(Level::INFO))
        .with_file(true)
        .with_line_number(true);
    tracing_subscriber::registry()
        .with(file_appender)
        .with(stdout)
        .init();
    std::panic::set_hook(Box::new(|_| {
        let trace = Backtrace::new();
        BACKTRACE.with(move |b| b.borrow_mut().replace(trace));
    }));
    guard_flush_file
}