package config import ( "encoding/json" "log" "os" "strings" "time" "github.com/sirupsen/logrus" "gorm.io/gorm/logger" ) const ( LOG_DIR = "./config/logs/query_log" ) type GroupedFieldsFormatter struct { TimestampFormat string } func SetupLogger() logger.Interface { err := os.MkdirAll(LOG_DIR, os.ModePerm) if err != nil { log.Fatalf("failed to create log directory: %v", err) } currentMonth := time.Now().Format("January") currentMonth = strings.ToLower(currentMonth) logFileName := currentMonth + "_query.log" logFile, err := os.OpenFile(LOG_DIR+"/"+logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { log.Fatalf("failed to open log file: %v", err) } newLogger := logger.New( log.New(logFile, "\r\n", log.LstdFlags), logger.Config{ SlowThreshold: time.Second, LogLevel: logger.Info, Colorful: false, }, ) return newLogger } func SetupLoggerLogrus() *logrus.Logger { err := os.MkdirAll(LOG_DIR, os.ModePerm) if err != nil { log.Fatalf("failed to create log directory: %v", err) } currentMonth := time.Now().Format("January") currentMonth = strings.ToLower(currentMonth) logFileName := currentMonth + "_app.log" // atau "_logrus.log" sesuai kebutuhan logFile, err := os.OpenFile(LOG_DIR+"/"+logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { log.Fatalf("failed to open log file: %v", err) } logger := logrus.New() logger.SetFormatter(&GroupedFieldsFormatter{TimestampFormat: time.RFC3339}) logger.SetOutput(logFile) logLevel := strings.ToLower(os.Getenv("LOG_LEVEL")) if logLevel == "production" { logger.SetLevel(logrus.WarnLevel) } else { logger.SetLevel(logrus.TraceLevel) } return logger } func (f *GroupedFieldsFormatter) Format(entry *logrus.Entry) ([]byte, error) { data := make(map[string]interface{}) fields := make(map[string]interface{}) // Pisahkan field bawaan dan custom for k, v := range entry.Data { fields[k] = v } data["fields"] = fields data["level"] = entry.Level.String() data["msg"] = entry.Message data["time"] = entry.Time.Format(f.TimestampFormat) serialized, err := json.Marshal(data) if err != nil { return nil, err } return append(serialized, '\n'), nil } // 🔹 Arahkan log bawaan Go ke logrus (biar library lain ikut nulis ke file) func RedirectDefaultLogger(logger *logrus.Logger) { log.SetOutput(logger.Writer()) }