3

我阅读了这篇关于如何使用日志中间件在 Actix 中执行 HTTP 请求日志记录的文章:

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

现在假设我还想使用 log crate 的框架在我的应用程序中添加日志记录。例如,我需要详细的调试跟踪和一个在实际恐慌停止世界之前输出恐慌消息的好地方。由于通过 log 只能配置一个记录器,这会导致问题吗?如果我还想深入记录当前的用户名或会话 ID,我是否必须一直将其传递下去,或者 Actix 是否有办法在全球范围内获得它?

4

1 回答 1

2

您可以为 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参数,您的模块路径将成为默认目标,或者文档说,但是我用于模块路径的每个拼写,包括越来越少的部分,包括类名等,都失败了,所以我这样做不了解文档。手动指定它确实有效,这就是我所做的。

在 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

于 2019-10-30T20:55:14.300 回答