Доработка. Журналирование

This commit is contained in:
Maxim
2026-06-09 11:00:20 +03:00
parent ac0e3944ab
commit 354156e557
7 changed files with 537 additions and 44 deletions

View File

@@ -10,11 +10,12 @@ import (
"io/fs"
"log"
"net/http"
"os"
"strings"
"time"
"gpio-monitor/internal/adapter"
"gpio-monitor/internal/logger"
"gpio-monitor/internal/pipe"
)
// ===== EMBED WEB =====
@@ -125,7 +126,6 @@ func handleCamProxy(w http.ResponseWriter, r *http.Request) {
for {
n, err := resp.Body.Read(buf)
if n > 0 {
_, err = w.Write(buf[:n])
if err != nil {
@@ -134,7 +134,6 @@ func handleCamProxy(w http.ResponseWriter, r *http.Request) {
}
flusher.Flush()
}
if err != nil {
if err != io.EOF {
log.Printf("[cam] stream ended: %v", err)
@@ -144,43 +143,6 @@ func handleCamProxy(w http.ResponseWriter, r *http.Request) {
}
}
// ===== PIPE READER =====
func startPipeReader(ctx context.Context, buf *adapter.RingBuffer, path string) {
go func() {
buffer := make([]byte, 64)
for {
select {
case <-ctx.Done():
return
default:
}
f, err := os.OpenFile(path, os.O_RDONLY, 0)
if err != nil {
time.Sleep(time.Second)
continue
}
log.Println("pipe connected")
for {
n, err := f.Read(buffer)
if err != nil {
f.Close()
break
}
for i := 0; i < n; i++ {
buf.Write(buffer[i])
}
}
log.Println("pipe disconnected, retry...")
}
}()
}
func cors(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
@@ -197,15 +159,49 @@ func cors(next http.HandlerFunc) http.HandlerFunc {
}
func main() {
pipePath := flag.String("pipe", "/tmp/gpio_pipe", "pipe path")
pipePath := flag.String("pipe", "/tmp/gpio_pipe", "путь к pipe")
flag.Parse()
// ===== ИНИЦИАЛИЗАЦИЯ ЛОГГЕРОВ =====
// 1. EventLogger (события системы)
eventLogger, err := logger.NewEventLogger("logs/events.log")
if err != nil {
log.Fatal("Ошибка инициализации EventLogger:", err)
}
defer eventLogger.Close()
eventLogger.Event("СЕРВЕР_ЗАПУЩЕН")
// 1.5 Human-readable логгер
humanLogger, err := logger.NewHumanLogger("logs/gpio_human.log")
if err != nil {
log.Fatal("Ошибка инициализации HumanLogger:", err)
}
defer humanLogger.Close()
eventLogger.Event("HUMAN_ЛОГЕРОТОВ")
// 2. Monitor (watchdog)
monitor := logger.NewMonitor(eventLogger)
// 3. DataLogger с ротацией
dataLogger, err := logger.NewRotatingLogger("logs/data", eventLogger)
if err != nil {
eventLogger.Event("ОШИБКАНИЦИАЛИЗАЦИИ_DATA_ЛОГЕРА")
log.Fatal("Ошибка инициализации DataLogger:", err)
}
defer dataLogger.Close()
eventLogger.Event("DATA_ЛОГЕРОТОВ")
// 4. RingBuffer
buf := adapter.NewRingBuffer(1024 * 10)
// 5. PipeReader
pipeReader := pipe.NewPipeReader(buf, dataLogger, humanLogger, monitor, eventLogger)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
pipeReader.Start(ctx, *pipePath)
startPipeReader(ctx, buf, *pipePath)
// ===== API И WEB СЕРВЕР =====
api := &API{
buf: buf,
startTime: time.Now(),
@@ -234,7 +230,6 @@ func main() {
if err != nil {
log.Fatal(err)
}
http.Handle("/", http.FileServer(http.FS(webFS)))
log.Println("Server started on :8080")