如何获取Rust Rocket框架500错误的详细报错信息?
获取Rocket服务器Panic的详细错误信息
问题背景
服务器端出现如下错误日志:
2023-08-16T06:24:47.573596263+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:56] ERROR rocket::server:Handler get_src panicked. 2023-08-16T06:24:47.573629024+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:56] WARN rocket::server:A panic is treated as an internal server error. 2023-08-16T06:24:47.573646358+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:325] WARN rocket::server:No 500 catcher registered. Using Rocket default. 2023-08-16T06:27:56.855388341+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:56] ERROR rocket::server:Handler get_src panicked. 2023-08-16T06:27:56.855422211+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:56] WARN rocket::server:A panic is treated as an internal server error. 2023-08-16T06:27:56.855437724+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:325] WARN rocket::server:No 500 catcher registered. Using Rocket default. 2023-08-16T06:27:58.894042355+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:56] ERROR rocket::server:Handler get_src panicked. 2023-08-16T06:27:58.894076040+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:56] WARN rocket::server:A panic is treated as an internal server error. 2023-08-16T06:27:58.894102580+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:325] WARN rocket::server:No 500 catcher registered. Using Rocket default. 2023-08-16T06:28:02.054234696+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:56] ERROR rocket::server:Handler get_src panicked. 2023-08-16T06:28:02.054270654+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:56] WARN rocket::server:A panic is treated as an internal server error. 2023-08-16T06:28:02.054285534+00:00 [/home/rust/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rocket-0.5.0-rc.3/src/server.rs:325] WARN rocket::server:No 500 catcher registered. Using Rocket default.
仅从日志只能得知get_src处理器发生了panic,没有更多细节。于是定义了如下500错误捕获器:
#![feature(proc_macro_hygiene, decl_macro)] #[macro_use] extern crate rocket; use rocket::Request; #[catch(500)] fn internal_error(req: &rocket::Request) -> String{ error!("internal error"); return "internal error".to_string(); } fn main() { rocket::ignite().register(catchers![internal_error]).launch(); }
请问如何获取服务器错误的详细信息?
解决方案
要获取panic的详细信息,可以通过以下几种方式实现:
1. 在捕获器中提取panic详情
Rocket的Request对象提供了panic_info()方法,能直接获取panic的负载信息和栈回溯。修改你的500捕获器:
#[catch(500)] fn internal_error(req: &rocket::Request) -> String { let error_details = match req.panic_info() { Some(info) => { let msg = info.payload().unwrap_or("无具体错误消息"); format!("Panic详情:{},栈回溯:{:?}", msg, info.location()) } None => "未捕获到panic详情".to_string() }; // 将详细错误写入日志 error!("{}", error_details); // 开发环境可返回详细信息,生产环境建议返回通用提示 error_details }
2. 启用Rocket开发模式
在debug编译模式下,使用rocket::build()替代rocket::ignite()启动服务,Rocket会自动开启开发模式,将包含栈回溯的详细错误直接返回给客户端,同时输出到日志:
fn main() { rocket::build() .register(catchers![internal_error]) .launch(); }
生产环境可通过设置环境变量ROCKET_ENV=production关闭此模式,避免泄露敏感信息。
3. 提升日志级别
将Rocket的日志级别设置为debug或trace,能在日志中看到更多底层执行细节。可以通过环境变量配置:
export RUST_LOG=rocket=debug
也可以在代码中直接配置:
use rocket::log::LogLevel; fn main() { rocket::build() .configure(rocket::Config::figment().merge(("log_level", LogLevel::Debug))) .register(catchers![internal_error]) .launch(); }
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

