46
46
#include < tuple>
47
47
#include < type_traits>
48
48
#include < utility>
49
+ #include < unordered_map>
49
50
50
51
#include " config.h"
51
52
#include " glog/platform.h"
@@ -337,6 +338,16 @@ const char* GetLogSeverityName(LogSeverity severity) {
337
338
return LogSeverityNames[severity];
338
339
}
339
340
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
+
340
351
static bool SendEmailInternal (const char * dest, const char * subject,
341
352
const char * body, bool use_logging);
342
353
@@ -437,6 +448,9 @@ class LogCleaner {
437
448
438
449
// Setting overdue to 0 days will delete all logs.
439
450
void Enable (const std::chrono::minutes& overdue);
451
+
452
+ void Enable (std::unordered_map<LogSeverity, std::chrono::minutes>& overdue_per_severity_);
453
+
440
454
void Disable ();
441
455
442
456
void Run (const std::chrono::system_clock::time_point& current_time,
@@ -460,8 +474,7 @@ class LogCleaner {
460
474
const std::chrono::system_clock::time_point& current_time) const ;
461
475
462
476
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_;
465
478
std::chrono::system_clock::time_point
466
479
next_cleanup_time_; // cycle count at which to clean overdue log
467
480
};
@@ -1286,7 +1299,14 @@ LogCleaner::LogCleaner() = default;
1286
1299
1287
1300
void LogCleaner::Enable (const std::chrono::minutes& overdue) {
1288
1301
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;
1290
1310
}
1291
1311
1292
1312
void LogCleaner::Disable () { enabled_ = false ; }
@@ -1471,7 +1491,14 @@ bool LogCleaner::IsLogLastModifiedOver(
1471
1491
const auto last_modified_time =
1472
1492
std::chrono::system_clock::from_time_t (file_stat.st_mtime );
1473
1493
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 ;
1475
1502
}
1476
1503
1477
1504
// If failed to get file stat, don't return true!
@@ -2627,6 +2654,10 @@ void EnableLogCleaner(const std::chrono::minutes& overdue) {
2627
2654
log_cleaner.Enable (overdue);
2628
2655
}
2629
2656
2657
+ void EnableLogCleaner (std::unordered_map<LogSeverity, std::chrono::minutes>& overdue_per_severity) {
2658
+ log_cleaner.Enable (overdue_per_severity);
2659
+ }
2660
+
2630
2661
void DisableLogCleaner () { log_cleaner.Disable (); }
2631
2662
2632
2663
LogMessageTime::LogMessageTime () = default ;
0 commit comments