1 个不稳定版本
0.0.1 | 2022 年 2 月 1 日 |
---|
#37 在 #watcher
在 rust-prec 中使用
15KB
285 代码行
rs-async-log-watcher
使用 tokio::fs 实现的异步日志监视器(不像 io_uring 那样真正异步,因为 tokio 使用工作线程来处理异步文件系统 I/O 操作)。
可以很好地处理文件删除,只要提供的路径中有文件,它就应该工作(即使文件在一段时间后被删除和重建)。如果您需要更多功能,可能需要查看 notify 并使用此库自行实现。
兼容 Unix/Windows。我没有基准测试(有许多可能的改进),但应该非常高效。应该可以启动成千上万的日志监视器而不必过于担心(tokio 可以很好地管理阻塞线程)。
示例
TL;DR
#[tokio::main]
async fn main() {
let mut log_watcher = async_log_watcher::LogWatcher::new("foobar.txt");
// spawn() returns a task handle that must be awaited somewhere to run the log reading loop
let log_watcher_handle = log_watcher.spawn(false);
// New task or thread or whatever. I'd prefer to not spawn tasks or include a tokio/rt dependency
// so the caller is responsable to drive the future somewhere.
tokio::task::spawn(async {
// This is going to run the log reading loop.
log_watcher_handle.await.unwrap();
});
// log_watcher.try_read_message() for non blocking reading
while let Some(data) = log_watcher.read_message().await {
for line in std::str::from_utf8(&data).unwrap().split('\n') {
println!("{}", line);
}
}
// Close log watcher by sending some command. You can also reload the file or change the file being read
log_watcher
.send_signal(LogWatcherSignal::Close)
.await
.unwrap();
}
依赖项
~2.1–3MB
~49K SLoC