From 431d74c802a6bce2305cea90e13eb633c7ab8a18 Mon Sep 17 00:00:00 2001 From: Marco Wang Date: Fri, 9 Oct 2020 22:40:12 +0800 Subject: [PATCH] src/logging.cc: Make LogCleaner aware of filename extension (#589) Previously, LogCleaner::IsLogFromCurrentProject() did not consider the custom file extension set with SetLogFilenameExtension(). This PR fixes it. Signed-off-by: Marco Wang --- src/logging.cc | 51 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/src/logging.cc b/src/logging.cc index 696aefb..8250396 100644 --- a/src/logging.cc +++ b/src/logging.cc @@ -473,14 +473,22 @@ class LogCleaner { void Enable(int overdue_days); void Disable(); - void Run(bool base_filename_selected, const string& base_filename) const; + void Run(bool base_filename_selected, + const string& base_filename, + const string& filename_extension) const; inline bool enabled() const { return enabled_; } private: - vector GetOverdueLogNames(string log_directory, int days, - const string& base_filename) const; - bool IsLogFromCurrentProject(const string& filepath, const string& base_filename) const; + vector GetOverdueLogNames(string log_directory, + int days, + const string& base_filename, + const string& filename_extension) const; + + bool IsLogFromCurrentProject(const string& filepath, + const string& base_filename, + const string& filename_extension) const; + bool IsLogLastModifiedOver(const string& filepath, int days) const; bool enabled_; @@ -1272,12 +1280,15 @@ void LogFileObject::Write(bool force_flush, } } #endif + // Perform clean up for old logs if (log_cleaner.enabled()) { if (base_filename_selected_ && base_filename_.empty()) { return; } - log_cleaner.Run(base_filename_selected_, base_filename_); + log_cleaner.Run(base_filename_selected_, + base_filename_, + filename_extension_); } } } @@ -1302,7 +1313,9 @@ void LogCleaner::Disable() { enabled_ = false; } -void LogCleaner::Run(bool base_filename_selected, const string& base_filename) const { +void LogCleaner::Run(bool base_filename_selected, + const string& base_filename, + const string& filename_extension) const { assert(enabled_ && overdue_days_ > 0); vector dirs; @@ -1315,15 +1328,20 @@ void LogCleaner::Run(bool base_filename_selected, const string& base_filename) c } for (size_t i = 0; i < dirs.size(); i++) { - vector logs = GetOverdueLogNames(dirs[i], overdue_days_, base_filename); + vector logs = GetOverdueLogNames(dirs[i], + overdue_days_, + base_filename, + filename_extension); for (size_t j = 0; j < logs.size(); j++) { static_cast(unlink(logs[j].c_str())); } } } -vector LogCleaner::GetOverdueLogNames(string log_directory, int days, - const string& base_filename) const { +vector LogCleaner::GetOverdueLogNames(string log_directory, + int days, + const string& base_filename, + const string& filename_extension) const { // The names of overdue logs. vector overdue_log_names; @@ -1342,7 +1360,7 @@ vector LogCleaner::GetOverdueLogNames(string log_directory, int days, continue; } string filepath = log_directory + ent->d_name; - if (IsLogFromCurrentProject(filepath, base_filename) && + if (IsLogFromCurrentProject(filepath, base_filename, filename_extension) && IsLogLastModifiedOver(filepath, days)) { overdue_log_names.push_back(filepath); } @@ -1354,7 +1372,8 @@ vector LogCleaner::GetOverdueLogNames(string log_directory, int days, } bool LogCleaner::IsLogFromCurrentProject(const string& filepath, - const string& base_filename) const { + const string& base_filename, + const string& filename_extension) const { // We should remove duplicated delimiters from `base_filename`, e.g., // before: "/tmp//.." // after: "/tmp/.." @@ -1376,6 +1395,16 @@ bool LogCleaner::IsLogFromCurrentProject(const string& filepath, return false; } + // Check if in the string `filename_extension` is right next to + // `cleaned_base_filename` in `filepath` if the user + // has set a custom filename extension. + if (!filename_extension.empty()) { + if (filepath.find(filename_extension) != cleaned_base_filename.size()) { + return false; + } + cleaned_base_filename += filename_extension; + } + // The characters after `cleaned_base_filename` should match the format: // YYYYMMDD-HHMMSS.pid for (size_t i = cleaned_base_filename.size(); i < filepath.size(); i++) {