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;