diff --git a/cmd/main.go b/cmd/main.go index 7c205ec..383a7e2 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -19,12 +19,17 @@ package main import ( "crypto/tls" "flag" + "log" "os" "path/filepath" locustiov1alpha1 "git.lilpenguins.com/crichardson/locust-operator/api/v1alpha1" "git.lilpenguins.com/crichardson/locust-operator/internal/controller" + "github.com/go-logr/logr" + "github.com/go-logr/zapr" "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "gopkg.in/natefinch/lumberjack.v2" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" @@ -245,3 +250,37 @@ func main() { os.Exit(1) } } + +func CreateFileLogger(fileName string, logLevel zapcore.LevelEnabler) logr.Logger { + + // Create file with desired permissions + file, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatal(err) + } + defer func() { + if cerr := file.Close(); cerr != nil && err == nil { + err = cerr + } + }() + + config := zap.NewProductionEncoderConfig() + config.EncodeTime = zapcore.ISO8601TimeEncoder + fileEncoder := zapcore.NewJSONEncoder(config) + consoleEncoder := zapcore.NewConsoleEncoder(config) + writer := zapcore.AddSync(&lumberjack.Logger{ + Filename: fileName, + MaxSize: 1000, // MB + MaxBackups: 3, + MaxAge: 90, // days + Compress: false, + }) + + core := zapcore.NewTee( + zapcore.NewCore(fileEncoder, writer, logLevel), + zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), logLevel), + ) + + logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel)) + return zapr.NewLogger(logger) +}