如何使用 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;
}
我想从一些 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;
}