12 个版本
0.3.3 | 2020 年 11 月 7 日 |
---|---|
0.3.2 | 2020 年 10 月 27 日 |
0.3.1 | 2020 年 4 月 19 日 |
0.2.7 | 2020 年 4 月 8 日 |
0.1.1 | 2020 年 3 月 14 日 |
#390 in 并发
315 个月下载量
在 async_logger_log 中使用
65KB
1.5K SLoC
async_logger
异步日志记录器允许将任意数据快速写入固定大小的内存缓冲区。内存缓冲区中的数据可以在单独的线程中处理。这个 crate 最初是为了日志记录目的而创建的,但也可以在任何其他地方用作队列。有关更多信息,请参阅 crate 文档。
基于此 crate 的 log 面板实现可作为单独的 crate 提供 async_logger_log。
简介
AsyncLoggerNB
是异步日志记录器/队列的实现,允许将任意切片写入内存缓冲区,然后将缓冲区发送到处理线程。
AsyncLoggerNB
使用一对固定大小的缓冲区;当一个缓冲区被多个线程写入时,另一个缓冲区被单个“写入器”线程处理。写入缓冲区是无锁操作。只有在缓冲区角色改变的时刻才会出现阻塞。这使得 AsyncLoggerNB
非常快,同时允许它有界限。在多线程多核环境中,当您不想丢弃消息或耗尽内存,但仍然希望保持无锁写入时,它可以有效地使用。
AsyncLoggerNB
可以处理序列化数据(字节流)或自定义复杂的数据结构,还可以处理对象的引用。
AsyncLoggerNB
可以接受任何实现 Writer
特性的“写入器”。此软件包包括 FileWriter
,它将数据写入文件。
示例
use async_logger::FileWriter;
use async_logger::AsyncLoggerNB;
use std::{thread, sync::Arc};
let writer = FileWriter::new("/tmp", 10*1024*1024).expect("Failed to create file writer");
let logger = Arc::new(AsyncLoggerNB::new(Box::new(writer), 8192)
.expect("Failed to create new async logger"));
let write_line = "Hello, world!\n";
let logger_c = logger.clone();
let handle = thread::spawn(move || {
logger_c.write_slice(write_line.as_bytes()).unwrap();
logger_c.write_slice(write_line.as_bytes()).unwrap();
logger_c.flush();
logger_c.write_slice(write_line.as_bytes()).unwrap();
});
handle.join().expect("Failed on thread join");
match Arc::try_unwrap(logger) {
Ok(logger) => logger.terminate(),
Err(_) => panic!("Failed to terminate logger because it is still in use"),
};
说明
- 此 crate 在 Linux x86_64 上进行了测试。Rust 版本 1.42。