rust crate log是最简单的使用自己的线程进行输出吗?

qoefvg9y  于 6个月前  发布在  其他
关注(0)|答案(2)|浏览(68)

学习如何在Rust中登录。

env_logger::Builder::from_env(Env::default().default_filter_or("info"))
    .init();
info!("Logger initialised!");

字符串
使用logenv_logger,这些消息是记录为“sync::mpsc::sync_channel”(多个生产者和一个消费者,保留提交的时间顺序),还是根本不并发?This似乎不建议,那里的作者似乎试图“推出自己的”。
如果没有,在Rust中使用并发日志记录器的最简单的方法是什么?显然,我可以设置自己的sync_channel安排。只是想知道是否有任何“交钥匙”解决方案。
也许这并不重要:也许管道足够轻量级,多个线程的日志输出将总是按时间顺序打印?目前我只记录到控制台,但我想找出如何记录到文件,我可以想象这可能会更棘手。

u2nhd7ah

u2nhd7ah1#

需要理解的是,log crate只是一个外观;它只是生成日志消息的库crate和按照自己的喜好引导和过滤这些消息的应用程序之间的接口。
所以log crate根本不协调线程。日志实现将被初始化到某个全局资源中,日志宏将转发所有对它的调用。它是logging implementation,决定了任何并发,线程或排序属性。
在本例中,您使用的是env-logger实现。它非常简单,归结为直接在调用log宏的地方对stdout进行写调用。没有通道,或单独的线程,或除此之外的额外同步。
如果您想要不同的行为,以便处理记录的消息不会减慢记录它们的代码,或者您的用例对时间和顺序特别敏感,则必须使用提供这种功能的不同日志记录实现。

um6iljoc

um6iljoc2#

也许可以看看spdlog-rs crate,它有一个可选的sink AsyncPoolSink(启用了crate特性multi-thread),可以在线程池中并行记录和刷新记录。
免责声明:我是这个板条箱的作者。

相关问题