学习如何在Rust中登录。
env_logger::Builder::from_env(Env::default().default_filter_or("info"))
.init();
info!("Logger initialised!");
字符串
使用log
和env_logger
,这些消息是记录为“sync::mpsc::sync_channel”(多个生产者和一个消费者,保留提交的时间顺序),还是根本不并发?This似乎不建议,那里的作者似乎试图“推出自己的”。
如果没有,在Rust中使用并发日志记录器的最简单的方法是什么?显然,我可以设置自己的sync_channel
安排。只是想知道是否有任何“交钥匙”解决方案。
也许这并不重要:也许管道足够轻量级,多个线程的日志输出将总是按时间顺序打印?目前我只记录到控制台,但我想找出如何记录到文件,我可以想象这可能会更棘手。
2条答案
按热度按时间u2nhd7ah1#
需要理解的是,log crate只是一个外观;它只是生成日志消息的库crate和按照自己的喜好引导和过滤这些消息的应用程序之间的接口。
所以log crate根本不协调线程。日志实现将被初始化到某个全局资源中,日志宏将转发所有对它的调用。它是logging implementation,决定了任何并发,线程或排序属性。
在本例中,您使用的是env-logger实现。它非常简单,归结为直接在调用log宏的地方对stdout进行写调用。没有通道,或单独的线程,或除此之外的额外同步。
如果您想要不同的行为,以便处理记录的消息不会减慢记录它们的代码,或者您的用例对时间和顺序特别敏感,则必须使用提供这种功能的不同日志记录实现。
um6iljoc2#
也许可以看看
spdlog-rs
crate,它有一个可选的sinkAsyncPoolSink
(启用了crate特性multi-thread
),可以在线程池中并行记录和刷新记录。免责声明:我是这个板条箱的作者。