From fd9de6d7faa9334f403e95dbc9226e474266a0c9 Mon Sep 17 00:00:00 2001 From: impressionyang Date: Fri, 12 Jun 2026 14:54:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B8=85=E7=A9=BA=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E9=80=9A=E8=BF=87=20Logger=20=E8=87=AA?= =?UTF-8?q?=E8=BA=AB=E6=96=B9=E6=B3=95=EF=BC=8C=E9=81=BF=E5=85=8D=E5=8F=A5?= =?UTF-8?q?=E6=9F=84=E4=B8=8D=E4=B8=80=E8=87=B4=E5=AF=BC=E8=87=B4=E7=A9=BA?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Logger 持有打开的文件句柄,用外部 QFile 句柄 truncate 会导致 Logger 写入位置异常,产生大量空行。现在通过 Logger::clearLogFile() 在持有锁的情况下 flush → resize(0) → seek(0),保证句柄一致。 Co-Authored-By: Claude Opus 4.7 --- src/ui/settings_page.cpp | 21 +++------------------ src/utils/logger.cpp | 9 +++++++++ src/utils/logger.h | 3 +++ 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/ui/settings_page.cpp b/src/ui/settings_page.cpp index 4fc3ea8..ea2bdcf 100644 --- a/src/ui/settings_page.cpp +++ b/src/ui/settings_page.cpp @@ -411,24 +411,9 @@ void SettingsPage::onResetConfig() { } void SettingsPage::onClearLogs() { - // 使用与 Logger 相同的路径逻辑 - QString logDir = configManager_->get("app.log_dir").toString(); - if (logDir.isEmpty()) { - logDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); - } - - auto result = clearDirectoryFiles(logDir, {"*.log"}, "日志文件", TruncateMode); - if (result.deletedCount < 0) { - QMessageBox::warning(this, "清除日志", "清除失败,请检查目录权限"); - return; - } - if (result.deletedCount == 0) { - QMessageBox::information(this, "清除日志", "没有可清除的日志文件"); - return; - } - QMessageBox::information(this, "清除日志", - QString("已清空 %1 个日志文件的内容,释放 %2 KB 空间") - .arg(result.deletedCount).arg(result.freedBytes / 1024)); + Logger::clearLogFile(); + LOG_INFO(kTag, "日志文件已通过 Logger 清空"); + QMessageBox::information(this, "清除日志", "日志文件已清空"); statusLabel_->setText("日志文件已清空"); } diff --git a/src/utils/logger.cpp b/src/utils/logger.cpp index 67451a8..b0d2335 100644 --- a/src/utils/logger.cpp +++ b/src/utils/logger.cpp @@ -60,6 +60,15 @@ void Logger::setLogFile(const QString& path) { } } +void Logger::clearLogFile() { + QMutexLocker locker(&mutex_); + if (logFile_ && logFile_->isOpen()) { + logFile_->flush(); + logFile_->resize(0); + logFile_->seek(0); + } +} + void Logger::log(LogLevel level, const QString& tag, const QString& message) { QMutexLocker locker(&mutex_); QString logLine = QString("[%1] [%2] [%3] %4") diff --git a/src/utils/logger.h b/src/utils/logger.h index 4fead08..2c15a14 100644 --- a/src/utils/logger.h +++ b/src/utils/logger.h @@ -39,6 +39,9 @@ public: /** @brief 设置日志文件路径(运行时切换) */ static void setLogFile(const QString& path); + /** @brief 清空日志文件内容(线程安全) */ + static void clearLogFile(); + private: static QString levelToString(LogLevel level); static QString getTimestamp();