From 29f3ee26f9e217c47cf43f102d1e841fb9fa187d Mon Sep 17 00:00:00 2001 From: Adrian Zuercher Date: Mon, 21 Apr 2025 12:59:16 +0200 Subject: [PATCH] new config options and error handles new input any --- go.mod | 5 ++++- go.sum | 2 ++ logging/cgf.go | 19 ++++++++++++++++ logging/logging.go | 56 +++++++++++++++++++++++++++++++++++----------- main.go | 13 +++++++---- 5 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 logging/cgf.go diff --git a/go.mod b/go.mod index 6ca9bb8..3f4aa02 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,9 @@ module github.com/tecamino/tecamino-logger go 1.21.0 -require go.uber.org/zap v1.27.0 +require ( + go.uber.org/zap v1.27.0 + gopkg.in/natefinch/lumberjack.v2 v2.2.1 +) require go.uber.org/multierr v1.10.0 // indirect diff --git a/go.sum b/go.sum index 2d29b57..853bbba 100644 --- a/go.sum +++ b/go.sum @@ -10,5 +10,7 @@ go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/logging/cgf.go b/logging/cgf.go new file mode 100644 index 0000000..4b55671 --- /dev/null +++ b/logging/cgf.go @@ -0,0 +1,19 @@ +package logging + +type Config struct { + MaxSize int // max. size of file in MB + MaxBackup int // + MaxAge int + Debug bool + TerminalOut bool +} + +func DefaultConfig() *Config { + return &Config{ + Debug: false, + TerminalOut: false, + MaxSize: 1, + MaxBackup: 3, + MaxAge: 28, + } +} diff --git a/logging/logging.go b/logging/logging.go index 1f0fce7..99fab46 100644 --- a/logging/logging.go +++ b/logging/logging.go @@ -7,6 +7,7 @@ import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" + "gopkg.in/natefinch/lumberjack.v2" ) type Level zapcore.Level @@ -24,14 +25,14 @@ type Logger struct { debugging bool } -func NewLogger(name string, debug bool) (*Logger, error) { +func NewLogger(file string, cfg *Config) (*Logger, error) { - if name == "" { - name = "NewLogger" + if cfg == nil { + cfg = DefaultConfig() } - file, err := os.OpenFile(fmt.Sprintf("%s.log", name), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - return nil, err + + if file == "" { + file = "NewLogger.log" } encoderConfig := zap.NewProductionEncoderConfig() @@ -41,13 +42,42 @@ func NewLogger(name string, debug bool) (*Logger, error) { } encoder := zapcore.NewJSONEncoder(encoderConfig) + fileSyncer := zapcore.AddSync(&lumberjack.Logger{ + Filename: file, + MaxSize: 1, // megabytes + MaxBackups: 3, + MaxAge: 28, // days + }) + + // Create core list + var cores []zapcore.Core + + // File core (always added) + cores = append(cores, zapcore.NewCore(encoder, fileSyncer, zapcore.InfoLevel)) + + // Optional stdout core + if cfg.TerminalOut { + stdoutSyncer := zapcore.AddSync(zapcore.Lock(os.Stdout)) + cores = append(cores, zapcore.NewCore(encoder, stdoutSyncer, zapcore.InfoLevel)) + } + + combinedCore := zapcore.NewTee(cores...) + + // If debugging, add a separate debug core (to both file and stdout if requested) + var debugCores []zapcore.Core + debugCores = append(debugCores, zapcore.NewCore(encoder, fileSyncer, zapcore.DebugLevel)) + if cfg.TerminalOut { + stdoutSyncer := zapcore.AddSync(zapcore.Lock(os.Stdout)) + debugCores = append(debugCores, zapcore.NewCore(encoder, stdoutSyncer, zapcore.DebugLevel)) + } + debugCore := zapcore.NewTee(debugCores...) + // Build the logger return &Logger{ - log: zap.New(zapcore.NewCore(encoder, zapcore.AddSync(file), zapcore.InfoLevel)), - debug: zap.New(zapcore.NewCore(encoder, zapcore.AddSync(file), zapcore.DebugLevel)), - debugging: debug, - }, - nil + log: zap.New(combinedCore), + debug: zap.New(debugCore), + debugging: cfg.Debug, + }, nil } func (l *Logger) Info(caller, msg string) { @@ -58,8 +88,8 @@ func (l *Logger) Warning(caller, msg string) { l.log.Warn(msg, zap.String("caller", caller)) } -func (l *Logger) Error(caller, msg string) { - l.log.Error(msg, zap.String("caller", caller)) +func (l *Logger) Error(caller string, msg any) { + l.log.Error(fmt.Sprint(msg), zap.String("caller", caller)) } func (l *Logger) Debug(caller, msg string) { diff --git a/main.go b/main.go index b658f7f..9b5d1f8 100644 --- a/main.go +++ b/main.go @@ -1,15 +1,20 @@ package main -import "github.com/tecamino/tecamino-logger/logging" +import ( + "errors" + + "github.com/tecamino/tecamino-logger/logging" +) func main() { - debug := false - log, err := logging.NewLogger("Test", debug) + log, err := logging.NewLogger("Test.log", nil) if err != nil { panic(err) } log.Info("line 10", "hallo") log.Warning("line 11", "vello") log.Error("line 12", "hie") - log.Debug("line 13", "isch") + err = errors.New("test error") + log.Error("line 14", err) + log.Debug("line 15", "isch") }