7个版本
0.3.0 | 2024年1月25日 |
---|---|
0.2.3 | 2023年1月30日 |
0.2.2 | 2022年12月19日 |
0.2.1 | 2022年4月8日 |
0.1.1 | 2021年10月20日 |
213 在 调试 中
13,012 每月下载量
19KB
191 行
日志-DTrace
将 slog
消息作为DTrace USDT探针转发。
概述
在生产应用程序中,日志记录非常有价值。然而,它也带来了一些困境。大多数时候,只有信息性或错误消息是有用的。但是当应用程序崩溃或行为异常时,检索更详细的日志信息可能非常有用。不幸的是,这通常只能通过重新启动进程并设置新的日志级别来实现。
此crate允许应用程序将 slog::Drain
、Dtrace排程,附加到它们的日志记录器,并将所有消息转发到DTrace。这是通过一个 usdt
探针函数来完成的,不同的探针指示不同的日志级别。
请注意,Dtrace排程将 仅 将消息发送到Dtrace,但在大多数情况下,用户已经将日志消息发送到某个位置(stdout、文件、syslog等)。可以使用 with_drain
构造函数生成一个Dtrace排程,该排程将消息转发到现有的排程以及Dtrace。
发出日志消息的Dtrace探针效率很高。特别是,当探针被禁用时,它所产生的成本不会超过层次结构中任何其他排程的成本。然而,当探针被启用时,无论日志级别如何,每个消息都可以在Dtrace中查看。
示例
$ cargo +nightly run --example simple
您可以在终端中看到只打印了警告消息。但是,在另一个shell中运行Dtrace命令应该会揭示更多消息。
# dtrace -Z -n 'slog*::: { printf("%s\n", copyinstr(arg0)); }' -q
{"ok": {"location":{"module":"simple","file":"examples/simple.rs","line":15},"level":"WARN","timestamp":"2021-10-19T17:55:55.260393409Z","message":"a warning message for everyone","kv":{"cool":true,"key":"value"}}}
{"ok": {"location":{"module":"simple","file":"examples/simple.rs","line":16},"level":"INFO","timestamp":"2021-10-19T17:55:55.260531762Z","message":"info is just for dtrace","kv":{"cool":true,"hello":"from dtrace","key":"value"}}}
{"ok": {"location":{"module":"simple","file":"examples/simple.rs","line":17},"level":"DEBUG","timestamp":"2021-10-19T17:55:55.260579423Z","message":"only dtrace gets debug messages","kv":{"cool":true,"hello":"from dtrace","key":"value"}}}
我们可以看到示例的stdout打印的警告消息,还可以看到信息和调试消息。每个日志级别都有特定的探针,允许用户针对特定级别的消息运行Dtrace操作。例如,此Dtrace命令仅接收通过 debug!
日志宏发出的消息。
# dtrace -Z -n 'slog*:::debug { printf("%s\n", copyinstr(arg0)); }' -q
{"ok": {"location":{"module":"simple","file":"examples/simple.rs","line":17},"level":"DEBUG","timestamp":"2021-10-19T17:57:30.578681933Z","message":"only dtrace gets debug messages","kv":{"cool":true,"hello":"from dtrace","key":"value"}}}
备注
此包从 usdt
包继承了夜班工具链的依赖。
依赖项
约7MB
约126K SLoC