2 个版本
0.1.1 | 2019 年 5 月 31 日 |
---|---|
0.1.0 | 2019 年 5 月 31 日 |
#886 在 异步
41,041 每月下载量
用于 2 crates
8KB
Slog Scope for Futures
许可
根据以下之一许可
- Apache License, Version 2.0, (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,应如上双重许可,不得附加任何其他条款或条件。
lib.rs
:
异步世界的 Slog Scope
此 crate 提供了一种使用与 futures 一起使用 slog scope 的机制。
问题
对于同步代码,slog-scope 运作正常。但是处理 async/await
呢?
这将无法编译
slog_scope::scope(&logger, || {
some_operation().await // Error: can't use await outside of an async fn/block
})
这可以编译,但并不符合您实际想要的结果
let logger = slog_scope::logger().new(o!("name" => "sub logger"));
let fut = slog_scope::scope(&logger, async || { // <- scope start
some_operation().await
}); // <- scope end
fut.await // Scope not active here while the future is actually running
解决方案
而不是使用闭包来表示 slog scope,日志记录器必须与 future 本身绑定,并将它的 poll
方法包装在 scope 中。 SlogScope
类型提供了一个 Future
包装器,正好可以做到这一点。
用法
直接使用包装器
use slog_scope_futures::SlogScope;
let logger = slog_scope::logger().new(o!("name" => "sub logger"));
SlogScope::new(logger, some_operation()).await
使用便利特质
use slog_scope_futures::FutureExt;
let logger = slog_scope::logger().new(o!("name" => "sub logger"));
some_operation().with_logger(logger).await
借用日志记录器与拥有日志记录器
通常,您需要 Future
是 'static
,以便它可以被生成到执行器中。然而,在其他时候,您可以通过借用日志记录器来摆脱困境。这样,它可以被重复使用,而无需额外的克隆处理。
由于 SlogScope
包装器接受任何 L: Borrow<Logger>
,您可以使用拥有的 或 借用的 Logger
来创建它。
use slog_scope_futures::FutureExt;
let logger = slog_scope::logger().new(o!("name" => "sub logger"));
some_operation().with_logger(&logger).await; // <- borrowed logger
let fut = some_other_operation().with_logger(logger); // <- owned logger
async fn assert_static<F: Future + 'static>(f: F) -> F::Output { f.await }
assert_static(fut).await
依赖关系
~365KB