如果我取消注释create_log,log和LOG都会打印在控制台上。没有它,任何东西都不会印刷。怎么一回事?
#[macro_use]
extern crate slog;
extern crate slog_term;
extern crate slog_async;
#[macro_use]
extern crate lazy_static;
use slog::Drain;
lazy_static! {
static ref LOG: slog::Logger = create_log();
}
fn create_log() -> slog::Logger {
let decorator = slog_term::TermDecorator::new().force_plain().build();
let drain = slog_term::CompactFormat::new(decorator).build().fuse();
let drain = slog_async::Async::new(drain).build().fuse();
slog::Logger::root(drain, o!())
}
fn main() {
info!(LOG, "LOG"); // NOT printed unless next line is uncommented
// let log = create_log(); // enables printing both log and LOG
// info!(log, "log");
}发布于 2017-11-17 02:14:11
通过使用slog-异步,你选择了
slog异步允许构建将处理卸载到另一个线程的
Drain。通常,序列化和IO操作的速度可能会很慢,以致于日志记录会阻碍主代码的性能。将日志记录发送到另一个线程要快得多(大约100 is )。
您的代码注册了一个日志事件,该日志事件将被发送到另一个线程,然后立即退出。没有时间让后台线程实际进行日志记录。
然而,通过在程序的末尾放置一个睡眠,它“工作”:
std::thread::sleep_ms(1000);为什么另一个案子起作用了?再说一遍,我们转到医生那里,强调我的:
当使用
std::process::exit使用退出代码终止进程时,注意到不会调用析构函数。这对于slog_async来说很重要,因为将防止异步漏出的刷新,并丢弃尚未写入的消息。
惰性静态不要运行它们的析构函数。中的项目(如果它的意义是要永远存在的话,它们什么时候会出现)。
当您从main函数构造另一个记录器时,将在堆栈上分配它,并将其删除。这将导致前一条日志消息也被刷新。
https://stackoverflow.com/questions/47342036
复制相似问题