Implemented a wait function to get all queued messages sent before exiting

This commit is contained in:
Magnus Åhall 2026-03-19 10:16:25 +01:00
parent 9f280a7883
commit d45003d1a3

37
lib.go
View file

@ -25,6 +25,8 @@ type VictoriaHandler struct {
Instance string Instance string
URL string URL string
waitCalled chan bool
queueLoopExited chan bool
handler slog.Handler handler slog.Handler
filecounter int filecounter int
logdir string logdir string
@ -49,6 +51,8 @@ func New(w io.Writer, opts slog.HandlerOptions, logdir, url, application, system
vl.logdir = logdir vl.logdir = logdir
vl.handler = slog.NewJSONHandler(w, &opts) vl.handler = slog.NewJSONHandler(w, &opts)
vl.waitCalled = make(chan bool)
vl.queueLoopExited = make(chan bool)
// logdir is used to spool logfiles in case of // logdir is used to spool logfiles in case of
err = os.MkdirAll(logdir, 0700) err = os.MkdirAll(logdir, 0700)
@ -75,6 +79,10 @@ func (vl VictoriaHandler) Handle(ctx context.Context, record slog.Record) error
vl.queue(record) vl.queue(record)
return vl.handler.Handle(ctx, record) return vl.handler.Handle(ctx, record)
} // }}} } // }}}
func (vl VictoriaHandler) Wait() { // {{{
vl.waitCalled <- true
<- vl.queueLoopExited
} // }}}
func (vl *VictoriaHandler) diskHandler() { // {{{ func (vl *VictoriaHandler) diskHandler() { // {{{
for { for {
@ -113,13 +121,40 @@ func (vl *VictoriaHandler) diskHandler() { // {{{
} // }}} } // }}}
func (vl *VictoriaHandler) queueHandler() { // {{{ func (vl *VictoriaHandler) queueHandler() { // {{{
var err error var err error
queueLoop:
for { for {
msg := <-vl.logQueue
msgLoop:
for {
select {
case msg := <-vl.logQueue:
err = vl.send(msg) err = vl.send(msg)
if err != nil { if err != nil {
vl.logToFile(msg) vl.logToFile(msg)
} }
// This can be selected while there still are messages in logQueue.
case <-vl.waitCalled:
break msgLoop
} }
}
// Another turn on log queue to gather up all remaining messages.
for {
select {
case msg := <-vl.logQueue:
err = vl.send(msg)
if err != nil {
vl.logToFile(msg)
}
default:
break queueLoop
}
}
}
vl.queueLoopExited <- true
} // }}} } // }}}
func (vl *VictoriaHandler) queue(rec slog.Record) { // {{{ func (vl *VictoriaHandler) queue(rec slog.Record) { // {{{