part of utils/zaplog.go:
// NewZapLogger initializes then returns a zap.Logger.
func NewZapLogger(path string) *zap.Logger {
dir := filepath.Dir(path)
if exist, _ := exists(dir); !exist {
if err := os.MkdirAll(dir, 0775); err != nil {
panic(fmt.Sprintf("Fail to create log directory: %v", err))
}
}
_, close, err := zap.Open(path)
if err != nil {
close()
panic(fmt.Sprintf("Fail to create/open log file: %v", err))
}
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.StringDurationEncoder,
EncodeCaller: zapcore.FullCallerEncoder,
}
atom := zap.NewAtomicLevelAt(zap.DebugLevel)
config := zap.Config{
Level: atom,
Development: true,
//DisableCaller: false,
//DisableStacktrace: false,
//Sampling: nil,
Encoding: "json",
EncoderConfig: encoderConfig,
OutputPaths: []string{path},
ErrorOutputPaths: []string{"stderr"},
InitialFields: map[string]interface{}{"serviceName": "ngapp"},
}
logger, err := config.Build()
if err != nil {
panic(fmt.Sprintf("Fail to initialize logger: %v", err))
}
defer logger.Sync()
logger.Info("Logger initialized.")
return logger
}
How to integrate Zap logger into ngapp?
app.logger = logger.WithOptions(zap.Hooks(func(entry zapcore.Entry) error {
// don't print debug/info on ngapp UI
if entry.Level < zap.WarnLevel {
return nil
} else {
app.logEdit.Append(fmt.Sprintf("<b>[%v]</b> : %v : %v : %s", entry.Level.CapitalString(), entry.Time.Format("2006-01-02 15:04:05.999"), entry.Caller.TrimmedPath(), entry.Message))
app.logEdit.Append(entry.Stack)
return nil
}
}))
Initialize zap logger at main:
logger := utils.NewZapLogger(fmt.Sprintf("./logs/ngapp_%v.log", time.Now().Format("20060102_150406")))
All source code will be pushed to github: https://github.com/zhenggao2/ngapp.git