首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么lazy_static日志::logger在使用非静态记录器之前不打印?

为什么lazy_static日志::logger在使用非静态记录器之前不打印?
EN

Stack Overflow用户
提问于 2017-11-17 01:44:23
回答 1查看 625关注 0票数 3

如果我取消注释create_loglogLOG都会打印在控制台上。没有它,任何东西都不会印刷。怎么一回事?

代码语言:javascript
复制
#[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");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-17 02:14:11

通过使用slog-异步,你选择了

slog异步允许构建将处理卸载到另一个线程的Drain。通常,序列化和IO操作的速度可能会很慢,以致于日志记录会阻碍主代码的性能。将日志记录发送到另一个线程要快得多(大约100 is )。

您的代码注册了一个日志事件,该日志事件将被发送到另一个线程,然后立即退出。没有时间让后台线程实际进行日志记录。

然而,通过在程序的末尾放置一个睡眠,它“工作”:

代码语言:javascript
复制
std::thread::sleep_ms(1000);

为什么另一个案子起作用了?再说一遍,我们转到医生那里,强调我的:

当使用std::process::exit使用退出代码终止进程时,注意到不会调用析构函数。这对于slog_async来说很重要,因为将防止异步漏出的刷新,并丢弃尚未写入的消息。

惰性静态不要运行它们的析构函数。中的项目(如果它的意义是要永远存在的话,它们什么时候会出现)。

当您从main函数构造另一个记录器时,将在堆栈上分配它,并将其删除。这将导致前一条日志消息也被刷新。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47342036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档