penambahan loger tersimpan
This commit is contained in:
@@ -376,3 +376,159 @@ func Fatal(msg string, fields ...map[string]interface{}) {
|
||||
func Fatalf(format string, args ...interface{}) {
|
||||
globalLogger.Fatalf(format, args...)
|
||||
}
|
||||
|
||||
// SaveLogText menyimpan log dalam format teks dengan pemisah |
|
||||
func (l *Logger) SaveLogText(entry LogEntry) error {
|
||||
// Format log dengan pemisah |
|
||||
logLine := fmt.Sprintf("%s|%s|%s|%s|%s|%s|%s|%s:%d",
|
||||
entry.Timestamp,
|
||||
entry.Level,
|
||||
entry.Service,
|
||||
entry.Message,
|
||||
entry.RequestID,
|
||||
entry.CorrelationID,
|
||||
entry.Duration,
|
||||
entry.File,
|
||||
entry.Line)
|
||||
|
||||
// Tambahkan fields jika ada
|
||||
if len(entry.Fields) > 0 {
|
||||
fieldsStr := ""
|
||||
for k, v := range entry.Fields {
|
||||
fieldsStr += fmt.Sprintf("|%s=%v", k, v)
|
||||
}
|
||||
logLine += fieldsStr
|
||||
}
|
||||
logLine += "\n"
|
||||
|
||||
// Buat direktori jika belum ada
|
||||
dirPath := "pkg/logger/data"
|
||||
if err := os.MkdirAll(dirPath, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Tulis ke file
|
||||
filePath := dirPath + "/logs.txt"
|
||||
f, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
if _, err := f.WriteString(logLine); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SaveLogJSON menyimpan log dalam format JSON
|
||||
func (l *Logger) SaveLogJSON(entry LogEntry) error {
|
||||
jsonData, err := json.Marshal(entry)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Buat direktori jika belum ada
|
||||
dirPath := "pkg/logger/data"
|
||||
if err := os.MkdirAll(dirPath, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Tulis ke file
|
||||
filePath := dirPath + "/logs.json"
|
||||
f, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
if _, err := f.WriteString(string(jsonData) + "\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SaveLogToDatabase menyimpan log ke database
|
||||
func (l *Logger) SaveLogToDatabase(entry LogEntry) error {
|
||||
// Implementasi penyimpanan ke database
|
||||
// Ini adalah contoh implementasi, sesuaikan dengan struktur database Anda
|
||||
|
||||
// Untuk saat ini, kita akan simpan ke file sebagai placeholder
|
||||
// Anda dapat mengganti ini dengan koneksi database yang sesuai
|
||||
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 {
|
||||
return err
|
||||
}
|
||||
|
||||
filePath := dirPath + "/database_logs.txt"
|
||||
f, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
if _, err := f.WriteString(dbLogLine); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// LogAndSave melakukan logging dan menyimpan ke semua format
|
||||
func (l *Logger) LogAndSave(level LogLevel, msg string, fields ...map[string]interface{}) {
|
||||
// Panggil fungsi log biasa
|
||||
l.log(level, msg, nil, fields...)
|
||||
|
||||
// Dapatkan entry log yang baru dibuat
|
||||
_, file, line, ok := runtime.Caller(2)
|
||||
var callerFile string
|
||||
var callerLine int
|
||||
if ok {
|
||||
parts := strings.Split(file, "/")
|
||||
if len(parts) > 2 {
|
||||
callerFile = strings.Join(parts[len(parts)-2:], "/")
|
||||
} else {
|
||||
callerFile = file
|
||||
}
|
||||
callerLine = line
|
||||
}
|
||||
|
||||
mergedFields := make(map[string]interface{})
|
||||
for _, f := range fields {
|
||||
for k, v := range f {
|
||||
mergedFields[k] = v
|
||||
}
|
||||
}
|
||||
|
||||
entry := LogEntry{
|
||||
Timestamp: time.Now().Format(time.RFC3339),
|
||||
Level: levelStrings[level],
|
||||
Service: l.serviceName,
|
||||
Message: msg,
|
||||
File: callerFile,
|
||||
Line: callerLine,
|
||||
Fields: mergedFields,
|
||||
}
|
||||
|
||||
// Simpan ke semua format
|
||||
go func() {
|
||||
l.SaveLogText(entry)
|
||||
l.SaveLogJSON(entry)
|
||||
l.SaveLogToDatabase(entry)
|
||||
}()
|
||||
}
|
||||
|
||||
// Global fungsi untuk menyimpan log
|
||||
func SaveLogText(entry LogEntry) error {
|
||||
return globalLogger.SaveLogText(entry)
|
||||
}
|
||||
|
||||
func SaveLogJSON(entry LogEntry) error {
|
||||
return globalLogger.SaveLogJSON(entry)
|
||||
}
|
||||
|
||||
func SaveLogToDatabase(entry LogEntry) error {
|
||||
return globalLogger.SaveLogToDatabase(entry)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user