From aa97deef9b7d749d4ccbfbb450c879b0d15829bd Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Thu, 30 Jan 2025 23:13:02 +0800 Subject: [PATCH] =?UTF-8?q?rft:=20=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E6=9C=9F=E9=97=B4Log=20Rotate=E5=A2=9E=E5=8A=A0=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=EF=BC=8C=E5=B9=B6=E4=B8=8A=E8=B0=83=E9=98=88=E5=80=BC?= =?UTF-8?q?=E8=87=B364MiB=20(#11670)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: Log Rotate在任务执行期间不进行检查导致单体log文件过大 * fix: unsigned type * perf: 加锁 * perf: 加锁优化 * perf: 上调log单文件大小至64MiB * perf: 继续优化 * perf: 优化加锁 * fix: 64MB --- src/MaaCore/Assistant.cpp | 2 +- src/MaaCore/Utils/Logger.hpp | 43 +++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/MaaCore/Assistant.cpp b/src/MaaCore/Assistant.cpp index 901014964b..458cc993dd 100644 --- a/src/MaaCore/Assistant.cpp +++ b/src/MaaCore/Assistant.cpp @@ -417,7 +417,7 @@ void Assistant::working_proc() finished_tasks.clear(); m_thread_idle = true; m_running = false; - Log.flush(); + Log.rotate_check(); m_condvar.wait(lock); continue; } diff --git a/src/MaaCore/Utils/Logger.hpp b/src/MaaCore/Utils/Logger.hpp index d0a5ff75a0..cd3ac9b2f2 100644 --- a/src/MaaCore/Utils/Logger.hpp +++ b/src/MaaCore/Utils/Logger.hpp @@ -557,7 +557,13 @@ public: LogStream(std::unique_lock&&, stream_t&&, Args&&...) -> LogStream; public: - virtual ~Logger() override { flush(false); } + virtual ~Logger() override + { + std::unique_lock m_trace_lock(m_trace_mutex); + if (m_ofs.is_open()) { + m_ofs.close(); + } + } // static bool set_directory(const std::filesystem::path& dir) // { @@ -575,6 +581,7 @@ public: if (!m_ofs || !m_ofs.is_open()) { m_ofs = std::ofstream(m_log_path, std::ios::out | std::ios::app); } + rotate_check(); if constexpr (std::same_as>) { #ifdef ASST_DEBUG return LogStream(m_trace_mutex, ostreams { console_ostream(std::cout), m_ofs }, arg); @@ -662,6 +669,7 @@ public: if (!m_ofs || !m_ofs.is_open()) { m_ofs = std::ofstream(m_log_path, std::ios::out | std::ios::app); } + rotate_check(lock); (LogStream( std::move(lock), #ifdef ASST_DEBUG @@ -673,15 +681,21 @@ public: << ... << std::forward(args)); } - void flush(bool rorate_log_file = true) + void rotate_check() { - std::unique_lock m_trace_lock(m_trace_mutex); - if (m_ofs.is_open()) { - m_ofs.close(); + if (!m_ofs || !m_ofs.is_open() || m_ofs.tellp() <= MaxLogSize) { + return; } - if (rorate_log_file) { - rotate(); + std::unique_lock trace_lock(m_trace_mutex); + rotate_check(trace_lock); + } + + void rotate_check([[maybe_unused]] std::unique_lock& lock) + { + if (!m_ofs || !m_ofs.is_open() || m_ofs.tellp() <= MaxLogSize) { + return; } + rotate(); } private: @@ -691,20 +705,18 @@ private: m_directory(UserDir.get()) { std::filesystem::create_directories(m_log_path.parent_path()); - rotate(); log_init_info(); } - void rotate() const + void rotate() { - constexpr uintmax_t MaxLogSize = 4ULL * 1024 * 1024; try { - if (std::filesystem::exists(m_log_path) && std::filesystem::is_regular_file(m_log_path)) { - const uintmax_t log_size = std::filesystem::file_size(m_log_path); - if (log_size >= MaxLogSize) { - std::filesystem::rename(m_log_path, m_log_bak_path); - } + if (!std::filesystem::exists(m_log_path) || !std::filesystem::is_regular_file(m_log_path)) { + return; } + m_ofs.close(); + std::filesystem::rename(m_log_path, m_log_bak_path); + m_ofs = std::ofstream(m_log_path, std::ios::out | std::ios::app); } catch (std::filesystem::filesystem_error& e) { std::cerr << e.what() << std::endl; @@ -731,6 +743,7 @@ private: std::filesystem::path m_log_bak_path = m_directory / "debug" / "asst.bak.log"; std::mutex m_trace_mutex; std::ofstream m_ofs; + const long long MaxLogSize = 64LL * 1024 * 1024; }; inline constexpr Logger::separator Logger::separator::none;