diff --git a/config/database.go b/config/database.go index fcfb55b..504e685 100644 --- a/config/database.go +++ b/config/database.go @@ -52,3 +52,4 @@ func CloseDatabaseConnection(db *gorm.DB) { } dbSQL.Close() } + diff --git a/config/logger.go b/config/logger.go index c08cf2e..5474a24 100644 --- a/config/logger.go +++ b/config/logger.go @@ -1,11 +1,13 @@ package config import ( + "encoding/json" "log" "os" "strings" "time" + "github.com/sirupsen/logrus" "gorm.io/gorm/logger" ) @@ -13,6 +15,10 @@ 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 { @@ -39,3 +45,50 @@ func SetupLogger() logger.Interface { 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 +}