将sentry-rust的init提取到独立函数后失效问题求助
问题原因及解决方法
核心问题出在Sentry返回的ClientGuard生命周期上:
sentry::init会返回一个ClientGuard实例(你代码里的_guard),这个实例的作用是:当它被销毁时,自动关闭Sentry客户端,并确保所有待发送的事件完成提交。- 第二个代码中,
init_instrumentation函数执行完毕后,局部变量_guard就会被销毁,此时Sentry客户端已经被关闭。后续在main里调用capture_message时,没有活跃的客户端处理消息,所以失效。 - 第一个代码里,
capture_message是在init_instrumentation函数内部调用的,此时_guard还未被销毁,客户端处于活跃状态,所以消息能正常发送。
解决方法
让init_instrumentation返回ClientGuard,在main中保存这个实例,延长它的生命周期到程序运行结束:
fn main() { // 保存guard,确保它存活到main函数结束 let _sentry_guard = init_instrumentation(); sentry::capture_message("Hello world", sentry::Level::Info); } fn init_instrumentation() -> sentry::ClientGuard { let sentry_options = sentry::ClientOptions { release: sentry::release_name!(), environment: Some(env_name.into()), ..Default::default() }; sentry::init((sentry_endpoint, sentry_options)) }
内容的提问来源于stack exchange,提问作者abhinavrathore019
相关产品推荐
相关产品推荐

