Files
FlexDXClusterGui/loghook.go
2025-10-19 10:15:11 +02:00

81 lines
1.4 KiB
Go

package main
import (
"sync"
log "github.com/sirupsen/logrus"
)
// LogBuffer garde les derniers logs en mémoire
type LogBuffer struct {
entries []LogEntry
maxSize int
mutex sync.RWMutex
}
type LogEntry struct {
Timestamp string `json:"timestamp"`
Level string `json:"level"`
Message string `json:"message"`
}
var logBuffer *LogBuffer
func NewLogBuffer(maxSize int) *LogBuffer {
return &LogBuffer{
entries: make([]LogEntry, 0, maxSize),
maxSize: maxSize,
}
}
func (lb *LogBuffer) Add(entry LogEntry) {
lb.mutex.Lock()
defer lb.mutex.Unlock()
lb.entries = append(lb.entries, entry)
// Garder seulement les N derniers
if len(lb.entries) > lb.maxSize {
lb.entries = lb.entries[1:]
}
}
func (lb *LogBuffer) GetAll() []LogEntry {
lb.mutex.RLock()
defer lb.mutex.RUnlock()
// Retourner une copie
result := make([]LogEntry, len(lb.entries))
copy(result, lb.entries)
return result
}
// Hook pour capturer les logs
type LogHook struct {
buffer *LogBuffer
}
func (h *LogHook) Levels() []log.Level {
return log.AllLevels
}
func (h *LogHook) Fire(entry *log.Entry) error {
logEntry := LogEntry{
Timestamp: entry.Time.Format("02-01-2006 15:04:05"),
Level: entry.Level.String(),
Message: entry.Message,
}
h.buffer.Add(logEntry)
// Broadcaster vers les clients WebSocket connectés
if httpServerInstance != nil {
httpServerInstance.broadcast <- WSMessage{
Type: "appLog",
Data: logEntry,
}
}
return nil
}