如何编写保存数据的记录器



我使用标准的锈蚀log模块。我正在尝试一个非常简单的记录器,记录通过debug!trace!等发送给它的所有内容。然后,我想不时地读取这些记录,并对它们做一些其他事情。我有这样的想法(我已经删除了无用的代码(:

struct SimpleLogger {
records : Vec<String>
}
impl SimpleLogger {
fn dump(&mut self) {
for x in self.records.into_iter() {
println!("{}", x);
}
self.records.clear();
}
}
impl log::Log for SimpleLogger {
fn log(&self, record: &Record) {
if self.enabled(record.metadata()) {
self.records.push(format!("{} - {}", record.level(), record.args()));
}
}
}

这具有挑战性,原因如下:

  • 一旦记录器被设置为全局记录器(使用log::set_logger(,我就失去了所有权。所以我不能再调用dump了(因为我不再引用它了,它已经被set_logger捕获了(
  • Log特性中,log方法接受对self的不可变引用。因此,我无法更新那里的记录向量

我检查过其他记录器,它们似乎使用了Write对象,但似乎所有的东西都被认为是传递记录,然后扔掉它们。此外,似乎记录器需要是线程安全的,所以我必须使用互斥。。。

我该怎么办?

我发现的最好、最简化的板条箱是这个,它在这里运行得很好,代码是

不要忘记将其添加到货物中。toml第一个

log2 = "0.1.7"

use log2::*;
fn main() {
let _log2 = log2::start();
trace!("send order request to server");
debug!("receive order response");
info!("order was executed");
warn!("network speed is slow");
error!("network connection was broken");
}

来源:https://crates.io/crates/log2

最新更新