Skip to content

Instantly share code, notes, and snippets.

@khiemdoan
Created April 28, 2026 06:46
Show Gist options
  • Select an option

  • Save khiemdoan/f3137d75096b1c8906f46f630a0aa28e to your computer and use it in GitHub Desktop.

Select an option

Save khiemdoan/f3137d75096b1c8906f46f630a0aa28e to your computer and use it in GitHub Desktop.
Simple logger using `zap` and `lumberjack`
// Author: Khiem Doan
// Github: https://github.com/khiemdoan
// Email: doankhiem.crazy<at>gmail.com
package logger
import (
"os"
"path/filepath"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
func NewLogger(logFile string) *zap.SugaredLogger {
logDir := "logs"
if fileInfo, err := os.Stat(logDir); os.IsNotExist(err) {
os.MkdirAll(logDir, 0755)
} else {
if !fileInfo.IsDir() {
os.Remove(logDir)
os.MkdirAll(logDir, 0755)
}
}
consoleCfg := zap.NewDevelopmentEncoderConfig()
consoleCfg.EncodeLevel = zapcore.CapitalColorLevelEncoder
consoleEncoder := zapcore.NewConsoleEncoder(consoleCfg)
consoleOutput := zapcore.AddSync(os.Stdout)
consoleLevel := zap.NewAtomicLevelAt(zap.InfoLevel)
fileCfg := zap.NewProductionEncoderConfig()
fileCfg.TimeKey = "time"
fileCfg.EncodeTime = zapcore.ISO8601TimeEncoder
fileEncoder := zapcore.NewJSONEncoder(fileCfg)
fileOutput := zapcore.AddSync(&lumberjack.Logger{
Filename: filepath.Join(logDir, logFile),
MaxSize: 10, // megabytes
MaxBackups: 3,
MaxAge: 7, // days
})
fileLevel := zap.NewAtomicLevelAt(zap.WarnLevel)
core := zapcore.NewTee(
zapcore.NewCore(consoleEncoder, consoleOutput, consoleLevel),
zapcore.NewCore(fileEncoder, fileOutput, fileLevel),
)
zapLogger := zap.New(core, zap.AddCaller())
return zapLogger.Sugar()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment