2025-04-12 15:25:34 +07:00

104 lines
2.3 KiB
Go

package initialize
import (
"os"
"github.com/dungnt11/todoms_golang/global"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// InitLogger khởi tạo logger
func InitLogger() *zap.Logger {
// Đảm bảo thư mục logs tồn tại
ensureLogDir(global.Config.Logger.FileLogName)
// Khởi tạo logger
return newLogger(global.Config.Logger)
}
// ensureLogDir đảm bảo thư mục logs tồn tại
func ensureLogDir(logPath string) {
// Tìm vị trí thư mục cuối cùng trong đường dẫn
lastSlash := 0
for i := len(logPath) - 1; i >= 0; i-- {
if logPath[i] == '/' {
lastSlash = i
break
}
}
// Nếu không có thư mục, không cần tạo
if lastSlash == 0 {
return
}
// Tạo thư mục nếu chưa tồn tại
dirPath := logPath[:lastSlash]
if _, err := os.Stat(dirPath); os.IsNotExist(err) {
os.MkdirAll(dirPath, 0755)
}
}
// newLogger tạo một logger mới
func newLogger(config global.LoggerConfig) *zap.Logger {
// Xác định level log
var level zapcore.Level
switch config.LogLevel {
case "debug":
level = zapcore.DebugLevel
case "info":
level = zapcore.InfoLevel
case "warn":
level = zapcore.WarnLevel
case "error":
level = zapcore.ErrorLevel
default:
level = zapcore.InfoLevel
}
// Cấu hình encoder
encoder := getEncoder()
// Cấu hình lumberjack để xoay vòng file log
hook := lumberjack.Logger{
Filename: config.FileLogName,
MaxSize: config.MaxSize, // megabytes
MaxBackups: config.MaxBackups,
MaxAge: config.MaxAge, // days
Compress: config.Compress,
}
// Tạo core cho zap
core := zapcore.NewCore(
encoder,
zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)),
level,
)
// Tạo logger với các tùy chọn
return zap.New(core,
zap.AddCaller(),
zap.AddStacktrace(zapcore.ErrorLevel),
)
}
// getEncoder trả về encoder cho zap
func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
// Cấu hình thời gian
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.TimeKey = "time"
// Cấu hình level
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
// Cấu hình caller
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
// Trả về encoder JSON
return zapcore.NewJSONEncoder(encoderConfig)
}