mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-17 18:01:26 +08:00
rft: 任务执行期间Log Rotate增加检查,并上调阈值至64MiB (#11670)
* fix: Log Rotate在任务执行期间不进行检查导致单体log文件过大 * fix: unsigned type * perf: 加锁 * perf: 加锁优化 * perf: 上调log单文件大小至64MiB * perf: 继续优化 * perf: 优化加锁 * fix: 64MB
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -557,7 +557,13 @@ public:
|
||||
LogStream(std::unique_lock<std::mutex>&&, stream_t&&, Args&&...) -> LogStream<stream_t>;
|
||||
|
||||
public:
|
||||
virtual ~Logger() override { flush(false); }
|
||||
virtual ~Logger() override
|
||||
{
|
||||
std::unique_lock<std::mutex> 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<level, remove_cvref_t<T>>) {
|
||||
#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>(args));
|
||||
}
|
||||
|
||||
void flush(bool rorate_log_file = true)
|
||||
void rotate_check()
|
||||
{
|
||||
std::unique_lock<std::mutex> 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<std::mutex> trace_lock(m_trace_mutex);
|
||||
rotate_check(trace_lock);
|
||||
}
|
||||
|
||||
void rotate_check([[maybe_unused]] std::unique_lock<std::mutex>& 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;
|
||||
|
||||
Reference in New Issue
Block a user