derniere version deepseek
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package pmolog
|
||||
|
||||
import (
|
||||
"container/ring"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"sync"
|
||||
@@ -14,6 +15,12 @@ type SSEBroker struct {
|
||||
mutex sync.Mutex
|
||||
}
|
||||
|
||||
// Buffer circulaire pour stocker les 1000 derniers messages
|
||||
var (
|
||||
logBuffer = ring.New(1000)
|
||||
bufferMutex sync.Mutex
|
||||
)
|
||||
|
||||
// Initialiser le broker SSE
|
||||
var broker = &SSEBroker{
|
||||
clients: make(map[chan string]bool),
|
||||
@@ -30,6 +37,12 @@ func (hook *SSELogHook) Fire(entry *logrus.Entry) error {
|
||||
// Formater le log avec le niveau et le message
|
||||
logLine := fmt.Sprintf("[%s] %s", entry.Level.String(), entry.Message)
|
||||
|
||||
// Ajouter le message au buffer circulaire
|
||||
bufferMutex.Lock()
|
||||
logBuffer.Value = logLine
|
||||
logBuffer = logBuffer.Next()
|
||||
bufferMutex.Unlock()
|
||||
|
||||
// Envoyer le log à tous les clients connectés
|
||||
broker.mutex.Lock()
|
||||
for client := range broker.clients {
|
||||
@@ -60,9 +73,32 @@ func sseHandler(w http.ResponseWriter, r *http.Request) {
|
||||
broker.clients[messageChan] = true
|
||||
broker.mutex.Unlock()
|
||||
|
||||
// Envoyer un message de bienvenue
|
||||
fmt.Fprintf(w, "event: message\ndata: %s\n\n", "{\"content\": \"Connexion établie. Attente des logs...\", \"level\": \"info\"}")
|
||||
// Envoyer d'abord les 1000 derniers messages stockés
|
||||
bufferMutex.Lock()
|
||||
logBuffer.Do(func(value interface{}) {
|
||||
if value != nil {
|
||||
if msg, ok := value.(string); ok {
|
||||
// Déterminer le niveau de log pour le style CSS
|
||||
level := "info"
|
||||
if len(msg) > 7 {
|
||||
switch msg[1:6] {
|
||||
case "ERROR":
|
||||
level = "error"
|
||||
case "WARNI":
|
||||
level = "warning"
|
||||
case "DEBUG":
|
||||
level = "debug"
|
||||
}
|
||||
}
|
||||
|
||||
// Formater le message en JSON pour inclure le niveau
|
||||
jsonMsg := fmt.Sprintf("{\"content\": \"%s\", \"level\": \"%s\"}", escapeJSONString(msg), level)
|
||||
fmt.Fprintf(w, "event: message\ndata: %s\n\n", jsonMsg)
|
||||
}
|
||||
}
|
||||
})
|
||||
w.(http.Flusher).Flush()
|
||||
bufferMutex.Unlock()
|
||||
|
||||
// Envoyer les logs au client au fur et à mesure
|
||||
for {
|
||||
@@ -218,7 +254,7 @@ var indexHTML = `
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>📝 Logs en temps réel</h1>
|
||||
<h1>📝 Logs en temps réel (1000 derniers messages)</h1>
|
||||
<div id="logs"></div>
|
||||
</div>
|
||||
|
||||
@@ -235,8 +271,8 @@ var indexHTML = `
|
||||
}
|
||||
});
|
||||
|
||||
eventSource.addEventListener('message', function(event) {
|
||||
const data = JSON.parse(event.data);
|
||||
// Fonction pour ajouter un message aux logs
|
||||
function addLogMessage(data) {
|
||||
const logLine = document.createElement('div');
|
||||
logLine.className = 'log-line ' + data.level;
|
||||
|
||||
@@ -257,6 +293,11 @@ var indexHTML = `
|
||||
|
||||
// Défilement automatique
|
||||
logsContainer.scrollTop = logsContainer.scrollHeight;
|
||||
}
|
||||
|
||||
eventSource.addEventListener('message', function(event) {
|
||||
const data = JSON.parse(event.data);
|
||||
addLogMessage(data);
|
||||
});
|
||||
|
||||
eventSource.onerror = function(error) {
|
||||
@@ -274,15 +315,15 @@ func indexHandler(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
func LoggerWeb(mux *http.ServeMux) {
|
||||
// Ajouter le hook SSE à Logrus
|
||||
logrus.AddHook(&SSELogHook{})
|
||||
|
||||
// Configurer Logrus pour le développement
|
||||
logrus.SetFormatter(&logrus.TextFormatter{
|
||||
ForceColors: true,
|
||||
FullTimestamp: true,
|
||||
})
|
||||
|
||||
// Ajouter le hook SSE à Logrus
|
||||
logrus.AddHook(&SSELogHook{})
|
||||
|
||||
mux.HandleFunc("/log", indexHandler)
|
||||
mux.HandleFunc("/log-sse", sseHandler)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user