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 }