Files
Ant-Browser/backend/internal/logger/memory_writer.go
T
Ant Browser Release Bot 6f58a6c19a publish: 1.0.0 snapshot (bad2ec1)
channel: master
version: 1.0.0
source-ref: master
published-at-utc: 2026-03-13T15:19:28Z
2026-03-13 23:19:29 +08:00

77 lines
1.7 KiB
Go

package logger
import (
"sync"
)
const defaultMemoryBufferSize = 500
// MemoryLogEntry 内存日志条目(供前端消费)
type MemoryLogEntry struct {
Time string `json:"time"`
Level string `json:"level"`
Component string `json:"component"`
Message string `json:"message"`
Fields map[string]interface{} `json:"fields,omitempty"`
}
// MemoryWriter 内存环形缓冲写入器,线程安全
type MemoryWriter struct {
mu sync.RWMutex
entries []MemoryLogEntry
maxSize int
}
var globalMemoryWriter *MemoryWriter
func init() {
globalMemoryWriter = &MemoryWriter{
entries: make([]MemoryLogEntry, 0, defaultMemoryBufferSize),
maxSize: defaultMemoryBufferSize,
}
}
// GetMemoryWriter 获取全局内存写入器
func GetMemoryWriter() *MemoryWriter {
return globalMemoryWriter
}
func (w *MemoryWriter) Write(entry *LogEntry) error {
if entry == nil {
return nil
}
w.mu.Lock()
defer w.mu.Unlock()
item := MemoryLogEntry{
Time: entry.Timestamp.Format("2006-01-02 15:04:05"),
Level: entry.Level.String(),
Component: entry.Component,
Message: entry.Message,
Fields: entry.Fields,
}
if len(w.entries) >= w.maxSize {
w.entries = w.entries[1:]
}
w.entries = append(w.entries, item)
return nil
}
func (w *MemoryWriter) Close() error { return nil }
// GetEntries 返回所有缓冲日志(最新在后)
func (w *MemoryWriter) GetEntries() []MemoryLogEntry {
w.mu.RLock()
defer w.mu.RUnlock()
result := make([]MemoryLogEntry, len(w.entries))
copy(result, w.entries)
return result
}
// Clear 清空缓冲
func (w *MemoryWriter) Clear() {
w.mu.Lock()
defer w.mu.Unlock()
w.entries = w.entries[:0]
}