Files
free-turn-proxy/mobile/logbuf.go
T

66 lines
1.6 KiB
Go

package mobile
import (
"fmt"
"log"
"strings"
"sync"
"time"
)
const logBufMax = 500
type logBuffer struct {
mu sync.Mutex
lines []string
}
func (b *logBuffer) append(line string) {
b.mu.Lock()
defer b.mu.Unlock()
b.lines = append(b.lines, line)
if len(b.lines) > logBufMax {
b.lines = b.lines[len(b.lines)-logBufMax:]
}
}
func (b *logBuffer) get() string {
b.mu.Lock()
defer b.mu.Unlock()
return strings.Join(b.lines, "\n")
}
func (b *logBuffer) clear() {
b.mu.Lock()
defer b.mu.Unlock()
b.lines = b.lines[:0]
}
var sharedLogBuf = &logBuffer{}
// GetLogs возвращает последние логи фреймворка (до 500 строк).
func GetLogs() string { return sharedLogBuf.get() }
// ClearLogs очищает буфер логов.
func ClearLogs() { sharedLogBuf.clear() }
// bufLogger реализует logx.Logger, пишет в stderr и в sharedLogBuf.
type bufLogger struct{ debug bool }
func (*bufLogger) write(level, format string, v ...any) {
msg := fmt.Sprintf(format, v...)
line := time.Now().Format("15:04:05") + " [" + level + "] " + msg
log.Print("[" + level + "] " + msg)
sharedLogBuf.append(line)
}
func (l *bufLogger) Debugf(format string, v ...any) {
if l.debug {
l.write("DBG", format, v...)
}
}
func (l *bufLogger) Infof(format string, v ...any) { l.write("INF", format, v...) }
func (l *bufLogger) Warnf(format string, v ...any) { l.write("WRN", format, v...) }
func (l *bufLogger) Errorf(format string, v ...any) { l.write("ERR", format, v...) }
func (l *bufLogger) DebugEnabled() bool { return l.debug }