#memory-buffer #logger #logging #async #data-processing #fixed-size #data-file

async_logger

异步日志记录器允许将任意切片写入内存缓冲区,然后由一个线程中的写入器处理

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 并发

Download history 3/week @ 2024-03-07 10/week @ 2024-03-14 6/week @ 2024-03-28 5/week @ 2024-04-04 1/week @ 2024-05-16

315 个月下载量
async_logger_log 中使用

MIT 许可证

65KB
1.5K SLoC

async_logger

Rust

异步日志记录器允许将任意数据快速写入固定大小的内存缓冲区。内存缓冲区中的数据可以在单独的线程中处理。这个 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"),
};

说明

  1. 此 crate 在 Linux x86_64 上进行了测试。Rust 版本 1.42。

无运行时依赖

功能