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
use std::panic;

use lcode_config::config::global;
use tracing_appender::rolling;
use tracing_subscriber::{
    fmt, prelude::__tracing_subscriber_SubscriberExt, util::SubscriberInitExt, EnvFilter, Registry,
};

use crate::mytui::term::Term;

/// Set the panic hook to log panic information
pub fn init_panic_hook() {
    panic::set_hook(Box::new(|panic| {
        let appender = rolling::never(&*global::G_CACHE_DIR, "lcode.log");
        let (non_blocking, _guard) = tracing_appender::non_blocking(appender);

        let env_filter =
            EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));

        let file_layer = fmt::layer()
            .with_thread_ids(true)
            .with_level(true)
            .with_ansi(false)
            .with_writer(non_blocking);

        let formatting_layer = fmt::layer()
            .pretty()
            .with_writer(std::io::stderr);

        Registry::default()
            .with(env_filter)
            .with(formatting_layer)
            .with(file_layer)
            .init();

        eprintln!("{}", panic);
        tracing::error!("Panic Error: {}", panic);

        Term::stop().expect("term stop failed");

        panic::take_hook()(panic);
    }));
    tracing::debug!("Set panic hook");
}