Skip to content

Instantly share code, notes, and snippets.

@rnyrnyrny
Last active March 20, 2023 14:26
Show Gist options
  • Save rnyrnyrny/a6dc926ae11951b753ecd66c00695397 to your computer and use it in GitHub Desktop.
Save rnyrnyrny/a6dc926ae11951b753ecd66c00695397 to your computer and use it in GitHub Desktop.
log using uber zap and lumberjack (zapcore.AddSync version)
// thanks to:
// https://github.com/uber-go/zap/blob/master/FAQ.md#does-zap-support-log-rotation
// https://studygolang.com/articles/17394
// https://stackoverflow.com/questions/54395407/zap-logging-with-1-customized-config-and-2-lumberjack
// Please test and debug it before putting it in production.
package logger
import (
"fmt"
"os"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
const (
// DPanic, Panic and Fatal level can not be set by user
DebugLevelStr string = "debug"
InfoLevelStr string = "info"
WarningLevelStr string = "warning"
ErrorLevelStr string = "error"
)
var (
globalLogger *zap.Logger
devMode bool = false
)
// call it in defer
func Sync() error {
return globalLogger.Sync()
}
func Init(logLevel string, logFile string, dev bool) error {
devMode = dev
var level zapcore.Level
switch logLevel {
case DebugLevelStr:
level = zap.DebugLevel
case InfoLevelStr:
level = zap.InfoLevel
case WarningLevelStr:
level = zap.WarnLevel
case ErrorLevelStr:
level = zap.ErrorLevel
default:
return fmt.Errorf("unknown log level %s", logLevel)
}
ws := zapcore.AddSync(&lumberjack.Logger{
Filename: logFile,
MaxSize: 1, //MB
MaxBackups: 30,
MaxAge: 90, //days
Compress: false,
})
core := zapcore.NewCore(
// use NewConsoleEncoder for human readable output
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
// write to stdout as well as log files
zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), ws),
zap.NewAtomicLevelAt(level),
)
var _globalLogger *zap.Logger
if dev {
_globalLogger = zap.New(core, zap.AddCaller(), zap.Development())
} else {
_globalLogger = zap.New(core)
}
zap.ReplaceGlobals(_globalLogger)
globalLogger = _globalLogger
return nil
}
func NewSugar(name string) *zap.SugaredLogger {
return globalLogger.Named(name).Sugar()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment