我使用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中显示消息。
发布于 2021-08-09 10:24:49
类似的文件系统事件通知通常被合并为一个,除非它们被读取器使用。例如,如果编写器将10个字节写入文件,则监视该文件写入的线程通常会看到一个事件,而不是10个事件。这在Linux上的inotify描述说明中有明确的概述,该说明很可能由QFileSystemWatcher内部使用。
这对于文件系统监控软件的任何正确实现都无关紧要。该通知仅允许监视器注意到发生了某些事件(例如,发生了写入),并且由软件来发现有关该事件的更多细节(例如,写入的数据量和写入位置)。
如果您的目标是仅显示写入的日志,则应该能够从当前读取位置到文件末尾只读取文件内容。该读取操作可以返回一个或多个日志记录。如果C++标准库以某种方式实现(例如,当auto_flush被禁用时,流缓冲区在发出write之前用部分日志记录内容填充内部缓冲区),它也可能返回不完整的日志记录。监控软件应解析读取的内容以分离日志记录,并检测不完整的日志记录(例如,按换行符拆分数据)。
https://stackoverflow.com/questions/68700737
复制相似问题