您如何在代码的更深处处理记录 HTTP 请求以及输出跟踪和错误消息等不同任务?

How do you tackle the distinct tasks of logging HTTP requests and outputting trace and error messages deeper in your code?

我阅读了有关如何使用日志记录中间件在 Actix 中执行 HTTP 请求日志记录的内容:

https://docs.rs/actix-web/1.0.0/actix_web/middleware/struct.Logger.html

现在说我还想使用日志箱的框架在我的应用程序中添加日志记录。例如,我需要详细的调试跟踪和一个在实际恐慌停止世界之前输出恐慌消息的好地方。由于log只能配置一个logger,这样会不会有问题?如果我还想深入记录当前的用户名或会话 ID,我是否必须一路传递下去,或者 Actix 是否有办法在全球范围内实现这一目标?

您可以对 Actix-web 和应用程序的其余部分使用相同的记录器。关键是通过包含可选参数 target 来区分对宏的调用(跟踪!、调试!、信息!、警告!和错误!)。然后你必须设置RUST_LOG环境变量。

调用示例:

RUST_LOG="info,parser::expression=trace,actix_web=info" cargo run
  • actix_web 以他们的代码为目标并打印信息和更高级别的消息。
  • parser::expression 以我的部分代码为目标并启用跟踪级消息。

在我的代码中,这里有一个示例跟踪消息:

    trace!(target: "parser::expression", "Tracing: {}", self.expression_source);

如果您省略 target 参数,您的模块路径将成为默认目标,或者文档是这样说的,但是我对模块路径使用的每个拼写,包括更多和更少的部分,包括 class name 等都失败了,所以我不明白文档。手动指定它确实有效,所以这就是我所做的。

在 Cargo.toml 文件中正确设置 crate 导入也很重要:

[dependencies]
log = { version = "0.4", features = ["max_level_trace", "release_max_level_warn", "std", "serde"] }

以上允许在开发版本上跟踪消息,但在发布版本上只允许警告。编译器会在编译时丢弃代码,所以在运行时改变环境变量对这种改变没有影响。

这里有一些有用的文档:

https://rust-lang-nursery.github.io/rust-cookbook/development_tools/debugging/config_log.html