如何解决如何在跟踪中使用动态跨度名称?
我需要动态检测具有不同名称的跨度。如何使用动态命名创建跟踪跨度?
use tracing; // 0.1.22
fn main() {
let name: &'static str = "foo bar";
let span = tracing::span!(tracing::Level::TRACE,name);
let span_handle = span.enter();
tracing::info!("Hello,world!");
drop(span_handle);
}
error[E0435]: attempt to use a non-constant value in a constant
--> src/main.rs:5:54
|
5 | let span = tracing::span!(tracing::Level::TRACE,name);
| ^^^^ non-constant value
解决方法
不要尝试动态设置跨度的名称,而是添加一个字段:
let value = "forty-two";
let span = tracing::span!(tracing::Level::TRACE,"foo bar",value = value);
来自the docs:
一个span由fields组成,用户定义的任意数据的键值对描述了span代表的上下文
,要确认您想要的是什么,它是您的跨度的动态命名,即。名称是在运行时决定的?或者您只是希望能够在常量中声明跨度的名称并在创建跨度时使用这些名称?
如果是前者,那么我不相信你能做到,因为宏明确只接受 literals
。但是,如果是后者,您可以通过基本宏来解决它。
macro_rules! prefix_name {
($name:literal) => {
concat!("prefix::",$name)
};
}
macro_rules! span_name {
() => {
"foo::bar"
};
}
那么下面就可以使用了
fn main() {
let span = tracing::span!(tracing::Level::TRACE,prefix_name!("foo bar"));
let span_handle = span.enter();
tracing::info!("Hello,world!");
drop(span_handle);
let span = tracing::span!(tracing::Level::TRACE,span_name!());
let span_handle = span.enter();
tracing::info!("Hello,world!");
drop(span_handle);
}
老实说,我只能猜测为什么会这样(所以任何确定知道的人,请随时纠正我)。但我会假设宏扩展发生在实际尝试编译代码之前。因此,当编译器尝试编译该跨度时,宏已经扩展为底层文字。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。