我使用标准的锈蚀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