masih perubahan

This commit is contained in:
2025-09-17 05:30:04 +07:00
parent 87b69ddb29
commit 1d053646a9
9 changed files with 149 additions and 936 deletions

View File

@@ -5,6 +5,7 @@ import (
"fmt"
"log"
"os"
"path/filepath"
"runtime"
"strings"
"sync"
@@ -47,6 +48,8 @@ type Logger struct {
output *log.Logger
mu sync.Mutex
jsonFormat bool
logDir string
}
// LogEntry represents a structured log entry
@@ -64,12 +67,81 @@ type LogEntry struct {
}
// New creates a new logger instance
func New(serviceName string, level LogLevel, jsonFormat bool) *Logger {
func New(serviceName string, level LogLevel, jsonFormat bool, logDir ...string) *Logger {
// Tentukan direktori log berdasarkan prioritas:
// 1. Parameter logDir (jika disediakan)
// 2. Environment variable LOG_DIR (jika ada)
// 3. Default ke pkg/logger/data relatif terhadap root proyek
var finalLogDir string
// Cek apakah logDir disediakan sebagai parameter
if len(logDir) > 0 && logDir[0] != "" {
finalLogDir = logDir[0]
} else {
// Cek environment variable
if envLogDir := os.Getenv("LOG_DIR"); envLogDir != "" {
finalLogDir = envLogDir
} else {
// Default: dapatkan path relatif terhadap root proyek
// Dapatkan path executable
exePath, err := os.Executable()
if err != nil {
// Fallback ke current working directory jika gagal
finalLogDir = filepath.Join(".", "pkg", "logger", "data")
} else {
// Dapatkan direktori executable
exeDir := filepath.Dir(exePath)
// Jika berjalan dengan go run, executable ada di temp directory
// Coba dapatkan path source code
if strings.Contains(exeDir, "go-build") || strings.Contains(exeDir, "tmp") {
// Gunakan runtime.Caller untuk mendapatkan path source
_, file, _, ok := runtime.Caller(0)
if ok {
// Dapatkan direktori source (2 level up dari pkg/logger)
sourceDir := filepath.Dir(file)
for i := 0; i < 3; i++ { // Naik 3 level ke root proyek
sourceDir = filepath.Dir(sourceDir)
}
finalLogDir = filepath.Join(sourceDir, "pkg", "logger", "data")
} else {
// Fallback
finalLogDir = filepath.Join(".", "pkg", "logger", "data")
}
} else {
// Untuk binary yang sudah dikompilasi, asumsikan struktur proyek
finalLogDir = filepath.Join(exeDir, "pkg", "logger", "data")
}
}
}
}
// Konversi ke path absolut
absPath, err := filepath.Abs(finalLogDir)
if err == nil {
finalLogDir = absPath
}
// Buat direktori jika belum ada
if err := os.MkdirAll(finalLogDir, 0755); err != nil {
// Fallback ke stdout jika gagal membuat direktori
fmt.Printf("Warning: Failed to create log directory %s: %v\n", finalLogDir, err)
return &Logger{
serviceName: serviceName,
level: level,
output: log.New(os.Stdout, "", 0),
jsonFormat: jsonFormat,
logDir: "", // Kosongkan karena gagal
}
}
return &Logger{
serviceName: serviceName,
level: level,
output: log.New(os.Stdout, "", 0),
jsonFormat: jsonFormat,
logDir: finalLogDir,
}
}
@@ -95,6 +167,7 @@ func (l *Logger) WithService(serviceName string) *Logger {
level: l.level,
output: l.output,
jsonFormat: l.jsonFormat,
logDir: l.logDir,
}
}
@@ -186,6 +259,7 @@ func (l *Logger) WithFields(fields map[string]interface{}) *Logger {
level: l.level,
output: l.output,
jsonFormat: l.jsonFormat,
logDir: l.logDir,
}
}
@@ -312,6 +386,7 @@ func (l *Logger) withField(key string, value interface{}) *Logger {
level: l.level,
output: l.output,
jsonFormat: l.jsonFormat,
logDir: l.logDir,
}
}
@@ -402,13 +477,15 @@ func (l *Logger) SaveLogText(entry LogEntry) error {
logLine += "\n"
// Buat direktori jika belum ada
dirPath := "pkg/logger/data"
if err := os.MkdirAll(dirPath, 0755); err != nil {
if err := os.MkdirAll(l.logDir, 0755); err != nil {
return err
}
// Tulis ke file
filePath := dirPath + "/logs.txt"
// Tulis ke file dengan mutex lock untuk concurrency safety
l.mu.Lock()
defer l.mu.Unlock()
filePath := filepath.Join(l.logDir, "logs.txt")
f, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return err
@@ -429,13 +506,15 @@ func (l *Logger) SaveLogJSON(entry LogEntry) error {
}
// Buat direktori jika belum ada
dirPath := "pkg/logger/data"
if err := os.MkdirAll(dirPath, 0755); err != nil {
if err := os.MkdirAll(l.logDir, 0755); err != nil {
return err
}
// Tulis ke file
filePath := dirPath + "/logs.json"
// Tulis ke file dengan mutex lock for concurrency safety
l.mu.Lock()
defer l.mu.Unlock()
filePath := filepath.Join(l.logDir, "logs.json")
f, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return err
@@ -458,12 +537,15 @@ func (l *Logger) SaveLogToDatabase(entry LogEntry) error {
dbLogLine := fmt.Sprintf("DB_LOG: %s|%s|%s|%s\n",
entry.Timestamp, entry.Level, entry.Service, entry.Message)
dirPath := "pkg/logger/data"
if err := os.MkdirAll(dirPath, 0755); err != nil {
if err := os.MkdirAll(l.logDir, 0755); err != nil {
return err
}
filePath := dirPath + "/database_logs.txt"
// Tulis ke file dengan mutex lock for concurrency safety
l.mu.Lock()
defer l.mu.Unlock()
filePath := filepath.Join(l.logDir, "database_logs.txt")
f, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return err