如何使用 tokio 在 Rust 中异步连续观看和读取文件

How to continuously watch and read file asynchronously in Rust using tokio

我想从一些 systemd 日志文件中连续提取数据。我有一个正则表达式,可以提取我感兴趣的内容。我不确定的是如何不断消化该文件。我正在使用 tokio 来保持异步。

我想知道我是否应该定期(例如每秒一次)打开该文件,读入缓冲区直到匹配之前的最后一行,如果我可以保持该文件打开(我不认为这是根据我的 Python 经验,这是个好主意,但我不确定在 rust 中是否可行)或者是否有另一种更优雅的方法来实现它。

提前致谢!

在匹配之前的最后一行之前不要读入缓冲区。相反,请跟踪您在文件中的位置,然后 seek 到该位置。您可以确保查找的文本匹配(并且查找成功)以确保文件没有被旋转或截断。

至于何时阅读,您可以轮询,也可以使用 API 来通知您更改。我没用过,但我发现 notify crate with a quick search. In addition to the crate documentation, the page here 看起来很有用。

根据 piojo 的评论,我发现这对我来说是一个可行的解决方案:

    let mut file = File::open(path).await.unwrap();
    let mut interval = time::interval(Duration::from_millis(1000));
    let mut contents = vec![];
    let mut position = 0;
    
    loop {
        contents.truncate(0);
        file.seek(SeekFrom::Start(position as u64)).await;
        position += file.read_to_end(&mut contents).await.unwrap();
        
        /// do_process(contents)
        
        interval.tick().await;
    }