4646#include < tuple>
4747#include < type_traits>
4848#include < utility>
49+ #include < unordered_map>
4950
5051#include " config.h"
5152#include " glog/platform.h"
@@ -337,6 +338,16 @@ const char* GetLogSeverityName(LogSeverity severity) {
337338 return LogSeverityNames[severity];
338339}
339340
341+ LogSeverity FindFilepathLogSeverity (const std::string& filepath) {
342+ for (int i = GLOG_INFO; i < NUM_SEVERITIES; i++) {
343+ if (filepath.find (GetLogSeverityName (static_cast <LogSeverity>(i))) != std::string::npos) {
344+ return static_cast <LogSeverity>(i);
345+ }
346+ }
347+ // assume that the file has the INFO severity
348+ return GLOG_INFO;
349+ }
350+
340351static bool SendEmailInternal (const char * dest, const char * subject,
341352 const char * body, bool use_logging);
342353
@@ -437,6 +448,9 @@ class LogCleaner {
437448
438449 // Setting overdue to 0 days will delete all logs.
439450 void Enable (const std::chrono::minutes& overdue);
451+
452+ void Enable (std::unordered_map<LogSeverity, std::chrono::minutes>& overdue_per_severity_);
453+
440454 void Disable ();
441455
442456 void Run (const std::chrono::system_clock::time_point& current_time,
@@ -460,8 +474,7 @@ class LogCleaner {
460474 const std::chrono::system_clock::time_point& current_time) const ;
461475
462476 bool enabled_{false };
463- std::chrono::minutes overdue_{
464- std::chrono::duration<int , std::ratio<kSecondsInWeek >>{1 }};
477+ std::unordered_map<LogSeverity, std::chrono::minutes> overdue_per_severity_;
465478 std::chrono::system_clock::time_point
466479 next_cleanup_time_; // cycle count at which to clean overdue log
467480};
@@ -1286,7 +1299,14 @@ LogCleaner::LogCleaner() = default;
12861299
12871300void LogCleaner::Enable (const std::chrono::minutes& overdue) {
12881301 enabled_ = true ;
1289- overdue_ = overdue;
1302+ for (int i = GLOG_INFO; i < NUM_SEVERITIES; i++) {
1303+ overdue_per_severity_[static_cast <LogSeverity>(i)] = overdue;
1304+ }
1305+ }
1306+
1307+ void LogCleaner::Enable (std::unordered_map<LogSeverity, std::chrono::minutes>& overdue_per_severity) {
1308+ enabled_ = true ;
1309+ overdue_per_severity_ = overdue_per_severity;
12901310}
12911311
12921312void LogCleaner::Disable () { enabled_ = false ; }
@@ -1471,7 +1491,14 @@ bool LogCleaner::IsLogLastModifiedOver(
14711491 const auto last_modified_time =
14721492 std::chrono::system_clock::from_time_t (file_stat.st_mtime );
14731493 const auto diff = current_time - last_modified_time;
1474- return diff >= overdue_;
1494+
1495+ LogSeverity severity = FindFilepathLogSeverity (filepath);
1496+ auto overdue_it = overdue_per_severity_.find (severity);
1497+ // if there is no overdue for this severity, do not delete it
1498+ if (overdue_it == overdue_per_severity_.end ()){
1499+ return false ;
1500+ }
1501+ return diff >= overdue_it->second ;
14751502 }
14761503
14771504 // If failed to get file stat, don't return true!
@@ -2627,6 +2654,10 @@ void EnableLogCleaner(const std::chrono::minutes& overdue) {
26272654 log_cleaner.Enable (overdue);
26282655}
26292656
2657+ void EnableLogCleaner (std::unordered_map<LogSeverity, std::chrono::minutes>& overdue_per_severity) {
2658+ log_cleaner.Enable (overdue_per_severity);
2659+ }
2660+
26302661void DisableLogCleaner () { log_cleaner.Disable (); }
26312662
26322663LogMessageTime::LogMessageTime () = default ;
0 commit comments