go-proxy/proxy_logging_runtime.go
Virgil 36fb1232d5 feat(proxy): implement runtime HTTP and logging hooks
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-04 11:03:54 +00:00

97 lines
1.9 KiB
Go

package proxy
import (
"fmt"
"os"
"sync"
"time"
)
type appendLineLogger struct {
path string
mu sync.Mutex
file *os.File
}
func newAppendLineLogger(path string) *appendLineLogger {
return &appendLineLogger{path: path}
}
func (l *appendLineLogger) writeLine(line string) {
if l == nil || l.path == "" {
return
}
l.mu.Lock()
defer l.mu.Unlock()
if l.file == nil {
file, errorValue := os.OpenFile(l.path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
if errorValue != nil {
return
}
l.file = file
}
_, _ = l.file.WriteString(line)
}
func subscribeAccessLog(events *EventBus, path string) {
if events == nil || path == "" {
return
}
logger := newAppendLineLogger(path)
events.Subscribe(EventLogin, func(event Event) {
if event.Miner == nil {
return
}
logger.writeLine(fmt.Sprintf("%s CONNECT %s %s %s\n",
time.Now().UTC().Format(time.RFC3339),
event.Miner.IP(),
event.Miner.User(),
event.Miner.Agent(),
))
})
events.Subscribe(EventClose, func(event Event) {
if event.Miner == nil {
return
}
logger.writeLine(fmt.Sprintf("%s CLOSE %s %s rx=%d tx=%d\n",
time.Now().UTC().Format(time.RFC3339),
event.Miner.IP(),
event.Miner.User(),
event.Miner.RX(),
event.Miner.TX(),
))
})
}
func subscribeShareLog(events *EventBus, path string) {
if events == nil || path == "" {
return
}
logger := newAppendLineLogger(path)
events.Subscribe(EventAccept, func(event Event) {
if event.Miner == nil {
return
}
logger.writeLine(fmt.Sprintf("%s ACCEPT %s diff=%d latency=%dms\n",
time.Now().UTC().Format(time.RFC3339),
event.Miner.User(),
event.Diff,
event.Latency,
))
})
events.Subscribe(EventReject, func(event Event) {
if event.Miner == nil {
return
}
logger.writeLine(fmt.Sprintf("%s REJECT %s reason=%q\n",
time.Now().UTC().Format(time.RFC3339),
event.Miner.User(),
event.Error,
))
})
}