masih perubahan
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user