QFileSystemWatcher 文件更改信号仅针对少数文件更新发出

QFileSystemWatcher file changed signal emits only ones for few file update

我正在使用 QFileSystemWatcher 来控制日志文件的更改。 为了创建和更新日志文件,我使用了 boost 库。

当我在一个方法文件中记录几条消息时,更改信号仅发出一条消息(对于最后一条消息),但每次添加日志消息后我都会看到该文件更新。

所以,QFileSystemWatcher 的代码是

    std::string fn = "app.log";
    logging::init_log(fn);
    QFileSystemWatcher* watcher = new QFileSystemWatcher();
    auto success = QObject::connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(handleFileChanged(QString)));
    Q_ASSERT(success);
    watcher->addPath(QString::fromStdString(fn));

添加日志消息

void a(){
    /* some code */
    logging::write_log("test error", logging::kError);
    logging::write_log("test info", logging::kInfo);
}

QFileSystemWatcher 只发出信息级消息的信号。 在文件管理器中,我看到该文件在每次调用后更新(测试错误、测试信息)。 在日志文件初始化中我使用

    sink->locked_backend()->auto_flush(true);

所以文件会立即更新。

我该如何解决这个问题?或者也许有另一种方法如何处理日志文件更新以在 GUI 中显示消息。

类似的文件系统事件通知通常合并为一个,除非它们被 reader 使用。例如,如果写入器向文件写入 10 个字节,则监视该文件写入的线程通常会看到一个事件而不是 10 个。这在 Linux 的 inotify 描述注释中明确概述,其中QFileSystemWatcher.

可能在内部使用

这对于文件系统监控软件的任何正确实施应该无关紧要。通知仅允许监视器注意到某些事件发生(例如发生了写入),并且由软件发现有关事件的更多详细信息(例如写入的数据量和写入位置)。

如果你的目标只是显示写入的日志,你应该能够从当前读取位置读取文件内容到文件末尾。该读取操作可能 return 一条或多条日志记录。它也可以 return 不完整的日志记录,如果 C++ 标准库以某种方式实现(例如,当 auto_flush 被禁用时,流缓冲区用部分日志记录填充内部缓冲区发布前的内容 write)。监控软件应对读取的内容进行解析,将日志记录分开,并检测不完整的日志记录(如按换行符分割数据)。