package logging import ( "log" "os" "github.com/go-logr/logr" "github.com/go-logr/zapr" "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" ) // CreateFileLogger Create a logger that will write to console, and file along with log rotation 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.NewDevelopmentEncoderConfig() 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.PanicLevel)) return zapr.NewLogger(logger) }