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:
status102
2025-01-30 23:13:02 +08:00
committed by GitHub
parent fa85cca0e2
commit aa97deef9b
2 changed files with 29 additions and 16 deletions

View File

@@ -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;
}

View File

@@ -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;