53 lines
1.0 KiB
Go
53 lines
1.0 KiB
Go
package ingest
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"net"
|
|
"strings"
|
|
|
|
"git.apinb.com/ops/logs/internal/config"
|
|
)
|
|
|
|
func StartSyslogUDP(ctx context.Context) error {
|
|
addr := strings.TrimSpace(config.Spec.Ingest.SyslogListenAddr)
|
|
if addr == "" {
|
|
return nil
|
|
}
|
|
pc, err := net.ListenPacket("udp", addr)
|
|
if err != nil {
|
|
return fmt.Errorf("syslog UDP 监听 %s 失败: %w", addr, err)
|
|
}
|
|
startWorker("syslog_udp", func() error {
|
|
defer pc.Close()
|
|
go func() {
|
|
<-ctx.Done()
|
|
_ = pc.Close()
|
|
}()
|
|
log.Printf("logs: syslog listening UDP %s", addr)
|
|
buf := make([]byte, 65536)
|
|
for {
|
|
n, remote, err := pc.ReadFrom(buf)
|
|
if err != nil {
|
|
if ctx.Err() != nil {
|
|
return nil
|
|
}
|
|
markWorkerError("syslog_udp", err)
|
|
log.Printf("logs: syslog read: %v", err)
|
|
continue
|
|
}
|
|
udpAddr, _ := remote.(*net.UDPAddr)
|
|
if udpAddr == nil {
|
|
continue
|
|
}
|
|
p := make([]byte, n)
|
|
copy(p, buf[:n])
|
|
a := *udpAddr
|
|
Global.HandleSyslog(&a, p)
|
|
markWorkerSucceeded("syslog_udp")
|
|
}
|
|
})
|
|
return nil
|
|
}
|