From 89f47c06df447cd135e09df65ded307f60c020a4 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 16 May 2023 17:50:15 +0200 Subject: [PATCH 1/4] app/log/RotatingFile.go: Adding GetFilename() --- app/log/RotatingFile.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/log/RotatingFile.go b/app/log/RotatingFile.go index 75fb813..7c22c14 100644 --- a/app/log/RotatingFile.go +++ b/app/log/RotatingFile.go @@ -58,6 +58,10 @@ func (w *RotatingFile) newFilename(name string) string { return fmt.Sprintf("%s-%s%s", name, time.Now().Format(w.format), ext) } +func (w RotatingFile) GetFilename() string { + return path.Base(w.fd.Name()) +} + // Rotate the file. func (w *RotatingFile) Rotate() error { dst, err := os.OpenFile(w.newFilename(w.fd.Name()), os.O_CREATE|os.O_WRONLY, 0o666) From e1c092659aabd680497d82f12f651ec71fed175c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 17 May 2023 10:51:03 +0200 Subject: [PATCH 2/4] Adding app/log/HookWriter.go --- app/log/HookWriter.go | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/log/HookWriter.go diff --git a/app/log/HookWriter.go b/app/log/HookWriter.go new file mode 100644 index 0000000..f85473f --- /dev/null +++ b/app/log/HookWriter.go @@ -0,0 +1,48 @@ +package log + +import ( + "io" + + log "github.com/sirupsen/logrus" +) + +type HookWriter struct { + Writer io.Writer + LogLevels []log.Level +} + +func (hook *HookWriter) Fire(entry *log.Entry) error { + line, err := entry.String() + if err != nil { + return err + } + _, err = hook.Writer.Write([]byte(line)) + return err +} + +func (hook *HookWriter) Levels() []log.Level { + return hook.LogLevels +} + +func MakeStdHook(writer io.Writer) *HookWriter { + return &HookWriter{ + Writer: writer, + LogLevels: []log.Level{ + log.InfoLevel, + log.DebugLevel, + }, + } +} + +func MakeErrorHook(writer io.Writer) *HookWriter { + return &HookWriter{ + Writer: writer, + LogLevels: []log.Level{ + log.ErrorLevel, + log.WarnLevel, + log.FatalLevel, + log.PanicLevel, + log.TraceLevel, + }, + } +} From 93e765f14c6c4a01ac0e7ef56d304e5646f962e9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 17 May 2023 10:52:12 +0200 Subject: [PATCH 3/4] cmd/thalos/main.go: Implement log splitting if file logging is enabled. --- app/log/RotatingFile.go | 8 ++++++-- cmd/thalos/main.go | 27 +++++++++++++++++++-------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/log/RotatingFile.go b/app/log/RotatingFile.go index 7c22c14..4654747 100644 --- a/app/log/RotatingFile.go +++ b/app/log/RotatingFile.go @@ -46,8 +46,12 @@ func NewRotatingFile(filename string, maxSize int64, maxAge time.Duration) (*Rot }, nil } -func NewRotatingFileFromConfig(config Config) (*RotatingFile, error) { - return NewRotatingFile(config.GetFilePath(), int64(config.MaxFileSize), config.MaxTime) +func NewRotatingFileFromConfig(config Config, suffix string) (*RotatingFile, error) { + if len(suffix) > 0 { + suffix = "_" + suffix + } + + return NewRotatingFile(config.GetFilePath()+suffix+".log", int64(config.MaxFileSize), config.MaxTime) } func (w *RotatingFile) newFilename(name string) string { diff --git a/cmd/thalos/main.go b/cmd/thalos/main.go index b74d1e5..5045673 100644 --- a/cmd/thalos/main.go +++ b/cmd/thalos/main.go @@ -3,6 +3,7 @@ package main import ( "context" "fmt" + "io" "os" "os/signal" "path" @@ -190,18 +191,28 @@ func main() { } if len(conf.Log.Filename) > 0 { - writer, err := NewRotatingFileFromConfig(conf.Log) + stdWriter, err := NewRotatingFileFromConfig(conf.Log, "info") if err != nil { - log.WithError(err).Fatal("Failed to open log") + log.WithError(err).Fatal("Failed to open info log") return } + errWriter, err := NewRotatingFileFromConfig(conf.Log, "error") + if err != nil { + log.WithError(err).Fatal("Failed to open error log") + return + } + log.WithFields(log.Fields{ - "maxfilesize": conf.Log.MaxFileSize, - "maxage": conf.Log.MaxTime, - "directory": conf.Log.GetDirectory(), - "filename": conf.Log.GetFilename(), - }).Info("Logging to file: ", conf.Log.GetFilePath()) - log.SetOutput(writer) + "maxfilesize": conf.Log.MaxFileSize, + "maxage": conf.Log.MaxTime, + "directory": conf.Log.GetDirectory(), + "info_filename": stdWriter.GetFilename(), + "error_filename": errWriter.GetFilename(), + }).Info("Logging to file") + + log.SetOutput(io.Discard) + log.AddHook(MakeStdHook(stdWriter)) + log.AddHook(MakeErrorHook(errWriter)) } // Init telegram notification service From 89ddc4b594c31e7ebe8853329645f61e0867ac87 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 17 May 2023 10:52:27 +0200 Subject: [PATCH 4/4] config.example.yml: Update log.filename to not include ".log" --- config.example.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.example.yml b/config.example.yml index caf4a10..06b035f 100644 --- a/config.example.yml +++ b/config.example.yml @@ -9,7 +9,7 @@ message_codec: "json" # Logging settings log: # Filename to use. - filename: thalos.log + filename: thalos # Directory to store the logfiles in. directory: logs # Format to rename log files when rotating