package initialize import ( "os" "github.com/dungnt11/senflow_app/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) }