setup loggers inside modules with attributes

This commit is contained in:
Joel Wetzell
2025-12-19 22:26:25 -06:00
parent 38d73881c9
commit 61bd4b64f5
18 changed files with 142 additions and 125 deletions

View File

@@ -16,6 +16,7 @@ type HTTPClient struct {
ctx context.Context ctx context.Context
client *http.Client client *http.Client
router route.RouteIO router route.RouteIO
logger *slog.Logger
} }
func init() { func init() {
@@ -23,7 +24,7 @@ func init() {
Type: "http.client", Type: "http.client",
New: func(ctx context.Context, config config.ModuleConfig, router route.RouteIO) (Module, error) { New: func(ctx context.Context, config config.ModuleConfig, router route.RouteIO) (Module, error) {
return &HTTPClient{config: config, ctx: ctx, router: router}, nil return &HTTPClient{config: config, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -43,7 +44,7 @@ func (hc *HTTPClient) Run() error {
} }
<-hc.ctx.Done() <-hc.ctx.Done()
slog.Debug("router context done in module", "id", hc.Id()) hc.logger.Debug("router context done in module")
return nil return nil
} }

View File

@@ -16,6 +16,7 @@ type HTTPServer struct {
Port uint16 Port uint16
ctx context.Context ctx context.Context
router route.RouteIO router route.RouteIO
logger *slog.Logger
} }
type ResponseData struct { type ResponseData struct {
@@ -39,7 +40,7 @@ func init() {
return nil, fmt.Errorf("http.server port must be uint16") return nil, fmt.Errorf("http.server port must be uint16")
} }
return &HTTPServer{Port: uint16(portNum), config: config, ctx: ctx, router: router}, nil return &HTTPServer{Port: uint16(portNum), config: config, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -89,12 +90,11 @@ func (hs *HTTPServer) Run() error {
go func() { go func() {
<-hs.ctx.Done() <-hs.ctx.Done()
slog.Debug("router context done in module", "id", hs.Id()) hs.logger.Debug("router context done in module")
httpServer.Close() httpServer.Close()
}() }()
err := httpServer.ListenAndServe() err := httpServer.ListenAndServe()
slog.Debug("http.server closed", "id", hs.Id())
// TODO(jwetzell): handle server closed error differently // TODO(jwetzell): handle server closed error differently
if err != nil { if err != nil {
return err return err

View File

@@ -16,6 +16,7 @@ type Interval struct {
ctx context.Context ctx context.Context
router route.RouteIO router route.RouteIO
ticker *time.Ticker ticker *time.Ticker
logger *slog.Logger
} }
func init() { func init() {
@@ -35,7 +36,7 @@ func init() {
return nil, fmt.Errorf("gen.interval duration must be number") return nil, fmt.Errorf("gen.interval duration must be number")
} }
return &Interval{Duration: uint32(durationNum), config: config, ctx: ctx, router: router}, nil return &Interval{Duration: uint32(durationNum), config: config, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -56,7 +57,7 @@ func (i *Interval) Run() error {
for { for {
select { select {
case <-i.ctx.Done(): case <-i.ctx.Done():
slog.Debug("router context done in module", "id", i.Id()) i.logger.Debug("router context done in module")
return nil return nil
case <-ticker.C: case <-ticker.C:
if i.router != nil { if i.router != nil {

View File

@@ -19,6 +19,7 @@ type MIDIInput struct {
router route.RouteIO router route.RouteIO
Port string Port string
SendFunc func(midi.Message) error SendFunc func(midi.Message) error
logger *slog.Logger
} }
func init() { func init() {
@@ -38,30 +39,30 @@ func init() {
return nil, fmt.Errorf("midi.input port must be a string") return nil, fmt.Errorf("midi.input port must be a string")
} }
return &MIDIInput{config: config, Port: portString, ctx: ctx, router: router}, nil return &MIDIInput{config: config, Port: portString, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
func (mc *MIDIInput) Id() string { func (mi *MIDIInput) Id() string {
return mc.config.Id return mi.config.Id
} }
func (mc *MIDIInput) Type() string { func (mi *MIDIInput) Type() string {
return mc.config.Type return mi.config.Type
} }
func (mc *MIDIInput) Run() error { func (mi *MIDIInput) Run() error {
defer midi.CloseDriver() defer midi.CloseDriver()
in, err := midi.FindInPort(mc.Port) in, err := midi.FindInPort(mi.Port)
if err != nil { if err != nil {
return fmt.Errorf("midi.input can't find input port: %s", mc.Port) return fmt.Errorf("midi.input can't find input port: %s", mi.Port)
} }
stop, err := midi.ListenTo(in, func(msg midi.Message, timestampms int32) { stop, err := midi.ListenTo(in, func(msg midi.Message, timestampms int32) {
if mc.router != nil { if mi.router != nil {
mc.router.HandleInput(mc.Id(), msg) mi.router.HandleInput(mi.Id(), msg)
} }
}, midi.UseSysEx()) }, midi.UseSysEx())
@@ -71,11 +72,11 @@ func (mc *MIDIInput) Run() error {
defer stop() defer stop()
<-mc.ctx.Done() <-mi.ctx.Done()
slog.Debug("router context done in module", "id", mc.Id()) mi.logger.Debug("router context done in module")
return nil return nil
} }
func (mc *MIDIInput) Output(payload any) error { func (mi *MIDIInput) Output(payload any) error {
return fmt.Errorf("midi.input output is not implemented") return fmt.Errorf("midi.input output is not implemented")
} }

View File

@@ -19,6 +19,7 @@ type MIDIOutput struct {
router route.RouteIO router route.RouteIO
Port string Port string
SendFunc func(midi.Message) error SendFunc func(midi.Message) error
logger *slog.Logger
} }
func init() { func init() {
@@ -39,26 +40,26 @@ func init() {
return nil, fmt.Errorf("midi.output port must be a string") return nil, fmt.Errorf("midi.output port must be a string")
} }
return &MIDIOutput{config: config, Port: portString, ctx: ctx, router: router}, nil return &MIDIOutput{config: config, Port: portString, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
func (mc *MIDIOutput) Id() string { func (mo *MIDIOutput) Id() string {
return mc.config.Id return mo.config.Id
} }
func (mc *MIDIOutput) Type() string { func (mo *MIDIOutput) Type() string {
return mc.config.Type return mo.config.Type
} }
func (mc *MIDIOutput) Run() error { func (mo *MIDIOutput) Run() error {
defer midi.CloseDriver() defer midi.CloseDriver()
out, err := midi.FindOutPort(mc.Port) out, err := midi.FindOutPort(mo.Port)
if err != nil { if err != nil {
return fmt.Errorf("midi.output can't find output port: %s", mc.Port) return fmt.Errorf("midi.output can't find output port: %s", mo.Port)
} }
send, err := midi.SendTo(out) send, err := midi.SendTo(out)
@@ -66,15 +67,15 @@ func (mc *MIDIOutput) Run() error {
return err return err
} }
mc.SendFunc = send mo.SendFunc = send
<-mc.ctx.Done() <-mo.ctx.Done()
slog.Debug("router context done in module", "id", mc.Id()) mo.logger.Debug("router context done in module")
return nil return nil
} }
func (mc *MIDIOutput) Output(payload any) error { func (mo *MIDIOutput) Output(payload any) error {
if mc.SendFunc == nil { if mo.SendFunc == nil {
return fmt.Errorf("midi.output output is not setup") return fmt.Errorf("midi.output output is not setup")
} }
@@ -84,5 +85,5 @@ func (mc *MIDIOutput) Output(payload any) error {
return fmt.Errorf("midi.output can only ouptut midi.Message") return fmt.Errorf("midi.output can only ouptut midi.Message")
} }
return mc.SendFunc(payloadMessage) return mo.SendFunc(payloadMessage)
} }

View File

@@ -18,6 +18,7 @@ type MQTTClient struct {
ClientID string ClientID string
Topic string Topic string
client mqtt.Client client mqtt.Client
logger *slog.Logger
} }
func init() { func init() {
@@ -61,7 +62,7 @@ func init() {
return nil, fmt.Errorf("mqtt.client clientId must be string") return nil, fmt.Errorf("mqtt.client clientId must be string")
} }
return &MQTTClient{config: config, Broker: brokerString, Topic: topicString, ClientID: clientIdString, ctx: ctx, router: router}, nil return &MQTTClient{config: config, Broker: brokerString, Topic: topicString, ClientID: clientIdString, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -99,7 +100,7 @@ func (mc *MQTTClient) Run() error {
} }
<-mc.ctx.Done() <-mc.ctx.Done()
slog.Debug("router context done in module", "id", mc.Id()) mc.logger.Debug("router context done in module")
return nil return nil
} }

View File

@@ -18,6 +18,7 @@ type NATSClient struct {
URL string URL string
Subject string Subject string
client *nats.Conn client *nats.Conn
logger *slog.Logger
} }
func init() { func init() {
@@ -49,7 +50,7 @@ func init() {
return nil, fmt.Errorf("nats.client subject must be string") return nil, fmt.Errorf("nats.client subject must be string")
} }
return &NATSClient{config: config, URL: urlString, Subject: subjectString, ctx: ctx, router: router}, nil return &NATSClient{config: config, URL: urlString, Subject: subjectString, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -87,7 +88,7 @@ func (nc *NATSClient) Run() error {
defer sub.Unsubscribe() defer sub.Unsubscribe()
<-nc.ctx.Done() <-nc.ctx.Done()
slog.Debug("router context done in module", "id", nc.Id()) nc.logger.Debug("router context done in module")
return nil return nil
} }

View File

@@ -18,6 +18,7 @@ type PSNClient struct {
ctx context.Context ctx context.Context
router route.RouteIO router route.RouteIO
decoder *psn.Decoder decoder *psn.Decoder
logger *slog.Logger
} }
func init() { func init() {
@@ -25,7 +26,7 @@ func init() {
Type: "psn.client", Type: "psn.client",
New: func(ctx context.Context, config config.ModuleConfig, router route.RouteIO) (Module, error) { New: func(ctx context.Context, config config.ModuleConfig, router route.RouteIO) (Module, error) {
return &PSNClient{config: config, decoder: psn.NewDecoder(), ctx: ctx, router: router}, nil return &PSNClient{config: config, decoder: psn.NewDecoder(), ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -58,7 +59,7 @@ func (pc *PSNClient) Run() error {
select { select {
case <-pc.ctx.Done(): case <-pc.ctx.Done():
// TODO(jwetzell): cleanup? // TODO(jwetzell): cleanup?
slog.Debug("router context done in module", "id", pc.Id()) pc.logger.Debug("router context done in module")
return nil return nil
default: default:
pc.conn.SetDeadline(time.Now().Add(time.Millisecond * 200)) pc.conn.SetDeadline(time.Now().Add(time.Millisecond * 200))
@@ -76,7 +77,7 @@ func (pc *PSNClient) Run() error {
message := buffer[:numBytes] message := buffer[:numBytes]
err := pc.decoder.Decode(message) err := pc.decoder.Decode(message)
if err != nil { if err != nil {
slog.Error("psn.client problem decoding psn traffic", "id", pc.Id(), "error", err) pc.logger.Error("psn.client problem decoding psn traffic", "error", err)
} }
if pc.router != nil { if pc.router != nil {
@@ -84,7 +85,7 @@ func (pc *PSNClient) Run() error {
pc.router.HandleInput(pc.Id(), tracker) pc.router.HandleInput(pc.Id(), tracker)
} }
} else { } else {
slog.Error("psn.client has no router", "id", pc.Id()) pc.logger.Error("psn.client has no router")
} }
} }
} }

View File

@@ -22,6 +22,7 @@ type SerialClient struct {
Framer framer.Framer Framer framer.Framer
Mode *serial.Mode Mode *serial.Mode
port serial.Port port serial.Port
logger *slog.Logger
} }
func init() { func init() {
@@ -74,82 +75,82 @@ func init() {
BaudRate: int(baudRateNum), BaudRate: int(baudRateNum),
} }
return &SerialClient{config: config, Port: portString, Framer: framer, Mode: &mode, ctx: ctx, router: router}, nil return &SerialClient{config: config, Port: portString, Framer: framer, Mode: &mode, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
func (mc *SerialClient) Id() string { func (sc *SerialClient) Id() string {
return mc.config.Id return sc.config.Id
} }
func (mc *SerialClient) Type() string { func (sc *SerialClient) Type() string {
return mc.config.Type return sc.config.Type
} }
func (mc *SerialClient) SetupPort() error { func (sc *SerialClient) SetupPort() error {
port, err := serial.Open(mc.Port, mc.Mode) port, err := serial.Open(sc.Port, sc.Mode)
if err != nil { if err != nil {
return fmt.Errorf("serial.client can't open input port: %s", mc.Port) return fmt.Errorf("serial.client can't open input port: %s", sc.Port)
} }
mc.port = port sc.port = port
return nil return nil
} }
func (mc *SerialClient) Run() error { func (sc *SerialClient) Run() error {
// TODO(jwetzell): shutdown with router.Context properly // TODO(jwetzell): shutdown with router.Context properly
go func() { go func() {
<-mc.ctx.Done() <-sc.ctx.Done()
slog.Debug("router context done in module", "id", mc.Id()) sc.logger.Debug("router context done in module")
if mc.port != nil { if sc.port != nil {
mc.port.Close() sc.port.Close()
} }
}() }()
for { for {
err := mc.SetupPort() err := sc.SetupPort()
if err != nil { if err != nil {
if mc.ctx.Err() != nil { if sc.ctx.Err() != nil {
slog.Debug("router context done in module", "id", mc.Id()) sc.logger.Debug("router context done in module")
return nil return nil
} }
slog.Error("serial.client", "id", mc.Id(), "error", err.Error()) sc.logger.Error("serial.client", "error", err.Error())
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
continue continue
} }
buffer := make([]byte, 1024) buffer := make([]byte, 1024)
select { select {
case <-mc.ctx.Done(): case <-sc.ctx.Done():
slog.Debug("router context done in module", "id", mc.Id()) sc.logger.Debug("router context done in module")
return nil return nil
default: default:
READ: READ:
for { for {
select { select {
case <-mc.ctx.Done(): case <-sc.ctx.Done():
slog.Debug("router context done in module", "id", mc.Id()) sc.logger.Debug("router context done in module")
return nil return nil
default: default:
byteCount, err := mc.port.Read(buffer) byteCount, err := sc.port.Read(buffer)
if err != nil { if err != nil {
mc.Framer.Clear() sc.Framer.Clear()
break READ break READ
} }
if mc.Framer != nil { if sc.Framer != nil {
if byteCount > 0 { if byteCount > 0 {
messages := mc.Framer.Decode(buffer[0:byteCount]) messages := sc.Framer.Decode(buffer[0:byteCount])
for _, message := range messages { for _, message := range messages {
if mc.router != nil { if sc.router != nil {
mc.router.HandleInput(mc.Id(), message) sc.router.HandleInput(sc.Id(), message)
} else { } else {
slog.Error("serial.client has no router", "id", mc.Id()) sc.logger.Error("serial.client has no router")
} }
} }
} }
@@ -160,7 +161,7 @@ func (mc *SerialClient) Run() error {
} }
} }
func (mc *SerialClient) Output(payload any) error { func (sc *SerialClient) Output(payload any) error {
payloadBytes, ok := payload.([]byte) payloadBytes, ok := payload.([]byte)
@@ -168,6 +169,6 @@ func (mc *SerialClient) Output(payload any) error {
return fmt.Errorf("serial.client can only ouptut bytes") return fmt.Errorf("serial.client can only ouptut bytes")
} }
_, err := mc.port.Write(mc.Framer.Encode(payloadBytes)) _, err := sc.port.Write(sc.Framer.Encode(payloadBytes))
return err return err
} }

View File

@@ -24,6 +24,7 @@ type SIPCallServer struct {
Transport string Transport string
UserAgent string UserAgent string
dg *diago.Diago dg *diago.Diago
logger *slog.Logger
} }
type SIPCallMessage struct { type SIPCallMessage struct {
@@ -85,24 +86,24 @@ func init() {
} }
userAgentString = specificTransportString userAgentString = specificTransportString
} }
return &SIPCallServer{config: config, ctx: ctx, router: router, IP: ipString, Port: int(portNum), Transport: transportString, UserAgent: userAgentString}, nil return &SIPCallServer{config: config, ctx: ctx, router: router, IP: ipString, Port: int(portNum), Transport: transportString, UserAgent: userAgentString, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
func (sds *SIPCallServer) Id() string { func (scs *SIPCallServer) Id() string {
return sds.config.Id return scs.config.Id
} }
func (sds *SIPCallServer) Type() string { func (scs *SIPCallServer) Type() string {
return sds.config.Type return scs.config.Type
} }
func (sds *SIPCallServer) Run() error { func (scs *SIPCallServer) Run() error {
diagoLogger := slog.New(slog.NewJSONHandler(io.Discard, nil)) diagoLogger := slog.New(slog.NewJSONHandler(io.Discard, nil))
ua, _ := sipgo.NewUA( ua, _ := sipgo.NewUA(
sipgo.WithUserAgent(sds.UserAgent), sipgo.WithUserAgent(scs.UserAgent),
sipgo.WithUserAgentTransportLayerOptions(sip.WithTransportLayerLogger(diagoLogger)), sipgo.WithUserAgentTransportLayerOptions(sip.WithTransportLayerLogger(diagoLogger)),
sipgo.WithUserAgentTransactionLayerOptions(sip.WithTransactionLayerLogger(diagoLogger)), sipgo.WithUserAgentTransactionLayerOptions(sip.WithTransactionLayerLogger(diagoLogger)),
) )
@@ -112,43 +113,43 @@ func (sds *SIPCallServer) Run() error {
media.SetDefaultLogger(diagoLogger) media.SetDefaultLogger(diagoLogger)
dg := diago.NewDiago(ua, diago.WithLogger(diagoLogger), diago.WithTransport( dg := diago.NewDiago(ua, diago.WithLogger(diagoLogger), diago.WithTransport(
diago.Transport{ diago.Transport{
Transport: sds.Transport, Transport: scs.Transport,
BindHost: sds.IP, BindHost: scs.IP,
BindPort: sds.Port, BindPort: scs.Port,
}, },
)) ))
go func() { go func() {
dg.Serve(sds.ctx, func(inDialog *diago.DialogServerSession) { dg.Serve(scs.ctx, func(inDialog *diago.DialogServerSession) {
sds.HandleCall(inDialog) scs.HandleCall(inDialog)
}) })
}() }()
sds.dg = dg scs.dg = dg
<-sds.ctx.Done() <-scs.ctx.Done()
slog.Debug("router context done in module", "id", sds.Id()) scs.logger.Debug("router context done in module")
return nil return nil
} }
func (sds *SIPCallServer) HandleCall(inDialog *diago.DialogServerSession) { func (scs *SIPCallServer) HandleCall(inDialog *diago.DialogServerSession) {
inDialog.Trying() inDialog.Trying()
inDialog.Ringing() inDialog.Ringing()
inDialog.Answer() inDialog.Answer()
sds.router.HandleInput(sds.Id(), SIPCallMessage{ scs.router.HandleInput(scs.Id(), SIPCallMessage{
To: inDialog.ToUser(), To: inDialog.ToUser(),
}) })
<-inDialog.Context().Done() <-inDialog.Context().Done()
} }
func (sds *SIPCallServer) Output(payload any) error { func (scs *SIPCallServer) Output(payload any) error {
payloadMsg, ok := payload.(string) payloadMsg, ok := payload.(string)
if !ok { if !ok {
return fmt.Errorf("sip.call.server output payload must be of type string") return fmt.Errorf("sip.call.server output payload must be of type string")
} }
if sds.dg == nil { if scs.dg == nil {
return fmt.Errorf("sip.call.server diago is not initialized") return fmt.Errorf("sip.call.server diago is not initialized")
} }
@@ -157,27 +158,27 @@ func (sds *SIPCallServer) Output(payload any) error {
if err != nil { if err != nil {
return fmt.Errorf("sip.call.server output payload is not a valid SIP URI: %v", err) return fmt.Errorf("sip.call.server output payload is not a valid SIP URI: %v", err)
} }
outDialog, err := sds.dg.NewDialog(uri, diago.NewDialogOptions{ outDialog, err := scs.dg.NewDialog(uri, diago.NewDialogOptions{
Transport: sds.Transport, Transport: scs.Transport,
}) })
if err != nil { if err != nil {
return fmt.Errorf("sip.call.server failed to create new dialog: %v", err) return fmt.Errorf("sip.call.server failed to create new dialog: %v", err)
} }
err = outDialog.Invite(sds.ctx, diago.InviteClientOptions{}) err = outDialog.Invite(scs.ctx, diago.InviteClientOptions{})
if err != nil { if err != nil {
return fmt.Errorf("sip.call.server failed to send invite: %v", err) return fmt.Errorf("sip.call.server failed to send invite: %v", err)
} }
err = outDialog.Ack(sds.ctx) err = outDialog.Ack(scs.ctx)
if err != nil { if err != nil {
return fmt.Errorf("sip.call.server failed to send ack: %v", err) return fmt.Errorf("sip.call.server failed to send ack: %v", err)
} }
// TODO(jwetzell): make this configurable // TODO(jwetzell): make this configurable
// NOTE(jwetzell): wait 5 seconds before hanging up the call // NOTE(jwetzell): wait 5 seconds before hanging up the call
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
err = outDialog.Hangup(sds.ctx) err = outDialog.Hangup(scs.ctx)
if err != nil { if err != nil {
return fmt.Errorf("sip.call.server failed to hangup call: %v", err) return fmt.Errorf("sip.call.server failed to hangup call: %v", err)
} }

View File

@@ -24,6 +24,7 @@ type SIPDTMFServer struct {
Port int Port int
Transport string Transport string
Separator string Separator string
logger *slog.Logger
} }
type SIPDTMFMessage struct { type SIPDTMFMessage struct {
@@ -90,7 +91,7 @@ func init() {
if !strings.ContainsRune("0123456789*#ABCD", rune(separatorString[0])) { if !strings.ContainsRune("0123456789*#ABCD", rune(separatorString[0])) {
return nil, fmt.Errorf("sip.dtmf.server separator must be a valid DTMF character") return nil, fmt.Errorf("sip.dtmf.server separator must be a valid DTMF character")
} }
return &SIPDTMFServer{config: config, ctx: ctx, router: router, IP: ipString, Port: int(portNum), Transport: transportString, Separator: separatorString}, nil return &SIPDTMFServer{config: config, ctx: ctx, router: router, IP: ipString, Port: int(portNum), Transport: transportString, Separator: separatorString, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -131,7 +132,7 @@ func (sds *SIPDTMFServer) Run() error {
} }
<-sds.ctx.Done() <-sds.ctx.Done()
slog.Debug("router context done in module", "id", sds.Id()) sds.logger.Debug("router context done in module")
return nil return nil
} }

View File

@@ -19,6 +19,7 @@ type TCPClient struct {
ctx context.Context ctx context.Context
router route.RouteIO router route.RouteIO
Addr *net.TCPAddr Addr *net.TCPAddr
logger *slog.Logger
} }
func init() { func init() {
@@ -73,7 +74,7 @@ func init() {
return nil, err return nil, err
} }
return &TCPClient{framer: framer, Addr: addr, config: config, ctx: ctx, router: router}, nil return &TCPClient{framer: framer, Addr: addr, config: config, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -91,7 +92,7 @@ func (tc *TCPClient) Run() error {
// TODO(jwetzell): shutdown with router.Context properly // TODO(jwetzell): shutdown with router.Context properly
go func() { go func() {
<-tc.ctx.Done() <-tc.ctx.Done()
slog.Debug("router context done in module", "id", tc.Id()) tc.logger.Debug("router context done in module")
if tc.conn != nil { if tc.conn != nil {
tc.conn.Close() tc.conn.Close()
} }
@@ -101,10 +102,10 @@ func (tc *TCPClient) Run() error {
err := tc.SetupConn() err := tc.SetupConn()
if err != nil { if err != nil {
if tc.ctx.Err() != nil { if tc.ctx.Err() != nil {
slog.Debug("router context done in module", "id", tc.Id()) tc.logger.Debug("router context done in module")
return nil return nil
} }
slog.Error("net.tcp.client", "id", tc.Id(), "error", err.Error()) tc.logger.Error("net.tcp.client", "error", err.Error())
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
continue continue
} }
@@ -112,14 +113,14 @@ func (tc *TCPClient) Run() error {
buffer := make([]byte, 1024) buffer := make([]byte, 1024)
select { select {
case <-tc.ctx.Done(): case <-tc.ctx.Done():
slog.Debug("router context done in module", "id", tc.Id()) tc.logger.Debug("router context done in module")
return nil return nil
default: default:
READ: READ:
for { for {
select { select {
case <-tc.ctx.Done(): case <-tc.ctx.Done():
slog.Debug("router context done in module", "id", tc.Id()) tc.logger.Debug("router context done in module")
return nil return nil
default: default:
byteCount, err := tc.conn.Read(buffer) byteCount, err := tc.conn.Read(buffer)
@@ -136,7 +137,7 @@ func (tc *TCPClient) Run() error {
if tc.router != nil { if tc.router != nil {
tc.router.HandleInput(tc.Id(), message) tc.router.HandleInput(tc.Id(), message)
} else { } else {
slog.Error("net.tcp.client has no router", "id", tc.Id()) tc.logger.Error("net.tcp.client has no router")
} }
} }
} }

View File

@@ -26,6 +26,7 @@ type TCPServer struct {
wg sync.WaitGroup wg sync.WaitGroup
connections []*net.TCPConn connections []*net.TCPConn
connectionsMu sync.RWMutex connectionsMu sync.RWMutex
logger *slog.Logger
} }
func init() { func init() {
@@ -81,7 +82,7 @@ func init() {
return nil, err return nil, err
} }
return &TCPServer{Framer: framer, Addr: addr, config: config, quit: make(chan interface{}), ctx: ctx, router: router}, nil return &TCPServer{Framer: framer, Addr: addr, config: config, quit: make(chan interface{}), ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -98,7 +99,7 @@ func (ts *TCPServer) handleClient(client *net.TCPConn) {
ts.connectionsMu.Lock() ts.connectionsMu.Lock()
ts.connections = append(ts.connections, client) ts.connections = append(ts.connections, client)
ts.connectionsMu.Unlock() ts.connectionsMu.Unlock()
slog.Debug("net.tcp.server connection accepted", "id", ts.Id(), "remoteAddr", client.RemoteAddr().String()) ts.logger.Debug("net.tcp.server connection accepted", "remoteAddr", client.RemoteAddr().String())
defer client.Close() defer client.Close()
buffer := make([]byte, 1024) buffer := make([]byte, 1024)
@@ -125,7 +126,7 @@ ClientRead:
break break
} }
} }
slog.Debug("net.tcp.server connection reset", "id", ts.Id(), "remoteAddr", client.RemoteAddr().String()) ts.logger.Debug("net.tcp.server connection reset", "remoteAddr", client.RemoteAddr().String())
ts.connectionsMu.Unlock() ts.connectionsMu.Unlock()
} }
} }
@@ -138,7 +139,7 @@ ClientRead:
break break
} }
} }
slog.Debug("net.tcp.server stream ended", "id", ts.Id(), "remoteAddr", client.RemoteAddr().String()) ts.logger.Debug("net.tcp.server stream ended", "remoteAddr", client.RemoteAddr().String())
ts.connectionsMu.Unlock() ts.connectionsMu.Unlock()
} }
return return
@@ -150,7 +151,7 @@ ClientRead:
if ts.router != nil { if ts.router != nil {
ts.router.HandleInput(ts.Id(), message) ts.router.HandleInput(ts.Id(), message)
} else { } else {
slog.Error("net.tcp.server has no router", "id", ts.Id()) ts.logger.Error("net.tcp.server has no router")
} }
} }
} }
@@ -170,7 +171,7 @@ func (ts *TCPServer) Run() error {
<-ts.ctx.Done() <-ts.ctx.Done()
close(ts.quit) close(ts.quit)
listener.Close() listener.Close()
slog.Debug("router context done in module", "id", ts.Id()) ts.logger.Debug("router context done in module")
}() }()
AcceptLoop: AcceptLoop:
@@ -181,7 +182,7 @@ AcceptLoop:
case <-ts.quit: case <-ts.quit:
break AcceptLoop break AcceptLoop
default: default:
slog.Debug("net.tcp.server problem with listener", "error", err) ts.logger.Debug("net.tcp.server problem with listener", "error", err)
} }
} else { } else {
ts.wg.Add(1) ts.wg.Add(1)

View File

@@ -16,6 +16,7 @@ type Timer struct {
ctx context.Context ctx context.Context
router route.RouteIO router route.RouteIO
timer *time.Timer timer *time.Timer
logger *slog.Logger
} }
func init() { func init() {
@@ -35,7 +36,7 @@ func init() {
return nil, fmt.Errorf("gen.timer duration must be a number") return nil, fmt.Errorf("gen.timer duration must be a number")
} }
return &Timer{Duration: uint32(durationNum), config: config, ctx: ctx, router: router}, nil return &Timer{Duration: uint32(durationNum), config: config, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -55,7 +56,7 @@ func (t *Timer) Run() error {
select { select {
case <-t.ctx.Done(): case <-t.ctx.Done():
t.timer.Stop() t.timer.Stop()
slog.Debug("router context done in module", "id", t.Id()) t.logger.Debug("router context done in module")
return nil return nil
case time := <-t.timer.C: case time := <-t.timer.C:
if t.router != nil { if t.router != nil {

View File

@@ -17,6 +17,7 @@ type UDPClient struct {
conn *net.UDPConn conn *net.UDPConn
ctx context.Context ctx context.Context
router route.RouteIO router route.RouteIO
logger *slog.Logger
} }
func init() { func init() {
@@ -52,7 +53,7 @@ func init() {
return nil, err return nil, err
} }
return &UDPClient{Addr: addr, config: config, ctx: ctx, router: router}, nil return &UDPClient{Addr: addr, config: config, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -79,7 +80,7 @@ func (uc *UDPClient) Run() error {
} }
<-uc.ctx.Done() <-uc.ctx.Done()
slog.Debug("router context done in module", "id", uc.Id()) uc.logger.Debug("router context done in module")
if uc.conn != nil { if uc.conn != nil {
uc.conn.Close() uc.conn.Close()
} }

View File

@@ -17,6 +17,7 @@ type UDPMulticast struct {
ctx context.Context ctx context.Context
router route.RouteIO router route.RouteIO
Addr *net.UDPAddr Addr *net.UDPAddr
logger *slog.Logger
} }
func init() { func init() {
@@ -51,7 +52,7 @@ func init() {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &UDPMulticast{config: config, Addr: addr, ctx: ctx, router: router}, nil return &UDPMulticast{config: config, Addr: addr, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -79,7 +80,7 @@ func (um *UDPMulticast) Run() error {
select { select {
case <-um.ctx.Done(): case <-um.ctx.Done():
// TODO(jwetzell): cleanup? // TODO(jwetzell): cleanup?
slog.Debug("router context done in module", "id", um.Id()) um.logger.Debug("router context done in module")
return nil return nil
default: default:
um.conn.SetDeadline(time.Now().Add(time.Millisecond * 200)) um.conn.SetDeadline(time.Now().Add(time.Millisecond * 200))
@@ -99,7 +100,7 @@ func (um *UDPMulticast) Run() error {
if um.router != nil { if um.router != nil {
um.router.HandleInput(um.Id(), message) um.router.HandleInput(um.Id(), message)
} else { } else {
slog.Error("net.udp.multicast has no router", "id", um.Id()) um.logger.Error("net.udp.multicast has no router")
} }
} }
} }

View File

@@ -17,6 +17,7 @@ type UDPServer struct {
config config.ModuleConfig config config.ModuleConfig
ctx context.Context ctx context.Context
router route.RouteIO router route.RouteIO
logger *slog.Logger
} }
func init() { func init() {
@@ -53,7 +54,7 @@ func init() {
log.Fatalf("error resolving UDP address: %v", err) log.Fatalf("error resolving UDP address: %v", err)
} }
return &UDPServer{Addr: addr, config: config, ctx: ctx, router: router}, nil return &UDPServer{Addr: addr, config: config, ctx: ctx, router: router, logger: slog.Default().With("component", "module", "id", config.Id)}, nil
}, },
}) })
} }
@@ -81,7 +82,7 @@ func (us *UDPServer) Run() error {
select { select {
case <-us.ctx.Done(): case <-us.ctx.Done():
// TODO(jwetzell): cleanup? // TODO(jwetzell): cleanup?
slog.Debug("router context done in module", "id", us.Id()) us.logger.Debug("router context done in module")
return nil return nil
default: default:
listener.SetDeadline(time.Now().Add(time.Millisecond * 200)) listener.SetDeadline(time.Now().Add(time.Millisecond * 200))
@@ -98,7 +99,7 @@ func (us *UDPServer) Run() error {
if us.router != nil { if us.router != nil {
us.router.HandleInput(us.Id(), message) us.router.HandleInput(us.Id(), message)
} else { } else {
slog.Error("net.udp.server has no router", "id", us.Id()) us.logger.Error("net.udp.server has no router")
} }
} }
} }

View File

@@ -10,10 +10,11 @@ import (
type DebugLog struct { type DebugLog struct {
config config.ProcessorConfig config config.ProcessorConfig
logger *slog.Logger
} }
func (dl *DebugLog) Process(ctx context.Context, payload any) (any, error) { func (dl *DebugLog) Process(ctx context.Context, payload any) (any, error) {
slog.Debug("debug.log", "payload", payload, "payloadType", fmt.Sprintf("%T", payload)) dl.logger.Debug("debug.log", "payload", payload, "payloadType", fmt.Sprintf("%T", payload))
return payload, nil return payload, nil
} }
@@ -25,7 +26,7 @@ func init() {
RegisterProcessor(ProcessorRegistration{ RegisterProcessor(ProcessorRegistration{
Type: "debug.log", Type: "debug.log",
New: func(config config.ProcessorConfig) (Processor, error) { New: func(config config.ProcessorConfig) (Processor, error) {
return &DebugLog{config: config}, nil return &DebugLog{config: config, logger: slog.Default().With("component", "processor")}, nil
}, },
}) })
} }