我有一个对象,希望每个日志输出都以对象的某些状态为前缀。但是为每条日志语句添加前缀是非常不方便的。有什么简单的实现方法吗?
下面是示例代码。
use log::info;
struct Obj {
id: i32,
name: String,
}
impl Obj {
// can I use `info!("receive {} from {}", item, from);` for simplicity?
fn call_me(&self, item: i32, from: String) {
info!("[id: {}][name: {}] receive {} from {}", self.id, self.name, item, from);
}
// ...many methods
}
任何帮助将不胜感激!
最佳答案
你可以为此写一个宏:
#[macro_export]
macro_rules! log {
($sel:ident, $s:literal, $($arg:tt)*)
=>
(info!(concat!("[id: {}] [name: {}] ", $s), $sel.id, $sel.name, $($arg)*));
}
struct Obj {
id: i32,
name: String,
}
impl Obj {
fn call_me(&self, item: i32, from: String) {
log!(self, "receive {} from {}", item, from);
}
}
它并不完美,因为您仍然需要通过 self
,但我不确定您是否可以做得更好。
关于logging - 如何为 Rust 中的日志输出添加特定前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58096003/