pub fn install_panic_hook() {
let prev = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
log_panic(info);
prev(info);
}));
}
fn log_panic(info: &std::panic::PanicHookInfo<'_>) {
let location = info
.location()
.map(|l| format!("{}:{}:{}", l.file(), l.line(), l.column()));
let location = location.as_deref().unwrap_or("<unknown location>");
let payload = info.payload();
let msg = if let Some(s) = payload.downcast_ref::<&str>() {
*s
} else if let Some(s) = payload.downcast_ref::<String>() {
s.as_str()
} else {
"<non-string panic payload>"
};
tracing::error!(location, message = msg, "Unexpected panic occurred");
}