From 8f898f4e32c4530da81a686e0219b99a3d463d48 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 17 Dec 2020 17:08:08 +0100 Subject: [PATCH] Delete old log files regularly --- core/core.go | 2 ++ core/logs.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 core/logs.go diff --git a/core/core.go b/core/core.go index a322f37e..886a8965 100644 --- a/core/core.go +++ b/core/core.go @@ -55,5 +55,7 @@ func start() error { return err } + registerLogCleaner() + return nil } diff --git a/core/logs.go b/core/logs.go new file mode 100644 index 00000000..06ce47c6 --- /dev/null +++ b/core/logs.go @@ -0,0 +1,57 @@ +package core + +import ( + "context" + "os" + "path/filepath" + "strings" + "time" + + "github.com/safing/portbase/dataroot" + "github.com/safing/portbase/log" + "github.com/safing/portbase/modules" +) + +const ( + logTTL = 30 * 24 * time.Hour + logFileDir = "logs" + logFileSuffix = ".log" +) + +func registerLogCleaner() { + module.NewTask("log cleaner", logCleaner). + Repeat(24 * time.Hour). + Schedule(time.Now().Add(15 * time.Minute)) +} + +func logCleaner(_ context.Context, _ *modules.Task) error { + ageThreshold := time.Now().Add(-logTTL) + + return filepath.Walk( + filepath.Join(dataroot.Root().Path, logFileDir), + func(path string, info os.FileInfo, err error) error { + if err != nil { + log.Warningf("core: failed to access %s while deleting old log files: %s", path, err) + return nil + } + + switch { + case !info.Mode().IsRegular(): + // Only delete regular files. + case !strings.HasSuffix(path, logFileSuffix): + // Only delete files that end with the correct suffix. + case info.ModTime().After(ageThreshold): + // Only delete files that are older that the log TTL. + default: + // Delete log file. + err := os.Remove(path) + if err != nil { + log.Warningf("core: failed to delete old log file %s: %s", path, err) + } else { + log.Tracef("core: deleted old log file %s", path) + } + } + + return nil + }) +}