#future #slog #scope #logger

slog-scope-futures

为 futures 设计的 slog-scope

2 个版本

0.1.1 2019 年 5 月 31 日
0.1.0 2019 年 5 月 31 日

#886异步

Download history 10020/week @ 2024-04-03 8860/week @ 2024-04-10 9622/week @ 2024-04-17 10680/week @ 2024-04-24 11718/week @ 2024-05-01 11560/week @ 2024-05-08 9443/week @ 2024-05-15 11234/week @ 2024-05-22 11167/week @ 2024-05-29 11165/week @ 2024-06-05 11625/week @ 2024-06-12 10280/week @ 2024-06-19 10428/week @ 2024-06-26 10065/week @ 2024-07-03 9899/week @ 2024-07-10 8788/week @ 2024-07-17

41,041 每月下载量
用于 2 crates

MIT/Apache

8KB

Slog Scope for Futures

version documentation license

许可

根据以下之一许可

由您选择。

贡献

除非您明确声明,否则根据 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