1 个不稳定版本

0.0.1 2022 年 2 月 1 日

#37#watcher


rust-prec 中使用

MIT/Apache

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