diff --git a/ascii_over_tcp_client.go b/ascii_over_tcp_client.go index d45b008..cc263e4 100644 --- a/ascii_over_tcp_client.go +++ b/ascii_over_tcp_client.go @@ -55,7 +55,7 @@ func (mb *asciiTCPTransporter) Send(aduRequest []byte) (aduResponse []byte, err } // Send the request - mb.Debug("modbus: send %q\n", aduRequest) + mb.logf("modbus: send %q\n", aduRequest) if _, err = mb.conn.Write(aduRequest); err != nil { return } @@ -78,6 +78,6 @@ func (mb *asciiTCPTransporter) Send(aduRequest []byte) (aduResponse []byte, err } } aduResponse = data[:length] - mb.Debug("modbus: recv %q\n", aduResponse) + mb.logf("modbus: recv %q\n", aduResponse) return } diff --git a/asciiclient.go b/asciiclient.go index 0deffea..d860fb3 100644 --- a/asciiclient.go +++ b/asciiclient.go @@ -181,7 +181,7 @@ func (mb *asciiSerialTransporter) Send(aduRequest []byte) (aduResponse []byte, e mb.startCloseTimer() // Send the request - mb.Debug("modbus: send % x\n", aduRequest) + mb.logf("modbus: send % x\n", aduRequest) if _, err = mb.port.Write(aduRequest); err != nil { return } @@ -204,7 +204,7 @@ func (mb *asciiSerialTransporter) Send(aduRequest []byte) (aduResponse []byte, e } } aduResponse = data[:length] - mb.Debug("modbus: recv % x\n", aduResponse) + mb.logf("modbus: recv % x\n", aduResponse) return } diff --git a/client.go b/client.go index 0c8e1b6..e7919c8 100644 --- a/client.go +++ b/client.go @@ -9,6 +9,11 @@ import ( "fmt" ) +// Logger is the interface to the required logging functions +type Logger interface { + Printf(format string, v ...any) +} + // DataSizeError represents an error for invalid data-sizes i.e. for cases // where the data-size does not match the expectation. type DataSizeError struct { diff --git a/cmd/modbus-cli/log.go b/cmd/modbus-cli/log.go new file mode 100644 index 0000000..8d2350a --- /dev/null +++ b/cmd/modbus-cli/log.go @@ -0,0 +1,11 @@ +package main + +import "log/slog" + +type debugAdapter struct { + *slog.Logger +} + +func (log *debugAdapter) Printf(msg string, args ...any) { + log.Logger.Debug(msg, args...) +} diff --git a/cmd/modbus-cli/main.go b/cmd/modbus-cli/main.go index 2c9c141..06b5a71 100644 --- a/cmd/modbus-cli/main.go +++ b/cmd/modbus-cli/main.go @@ -74,7 +74,7 @@ func main() { startReg := uint16(*register) if *logframe { - opt.logger = logger + opt.logger = &debugAdapter{logger} } var ( @@ -238,7 +238,7 @@ func convertToBytes(eType string, order binary.ByteOrder, forcedOrder string, va } func resultToFile(r []byte, filename string) error { - return os.WriteFile(filename, r, 0644) + return os.WriteFile(filename, r, 0o644) } func resultToRawString(r []byte, startReg int) (string, error) { @@ -421,7 +421,7 @@ type option struct { slaveID int timeout time.Duration - logger *slog.Logger + logger modbus.Logger rtu struct { baudrate int diff --git a/rtu_over_tcp_client.go b/rtu_over_tcp_client.go index 5b28691..1a88080 100644 --- a/rtu_over_tcp_client.go +++ b/rtu_over_tcp_client.go @@ -57,7 +57,7 @@ func (mb *rtuTCPTransporter) Send(aduRequest []byte) (aduResponse []byte, err er } // Send the request - mb.Debug("modbus: send % x\n", aduRequest) + mb.logf("modbus: send % x\n", aduRequest) if _, err = mb.conn.Write(aduRequest); err != nil { return } @@ -95,6 +95,6 @@ func (mb *rtuTCPTransporter) Send(aduRequest []byte) (aduResponse []byte, err er return } aduResponse = data[:n] - mb.Debug("modbus: recv % x\n", aduResponse) + mb.logf("modbus: recv % x\n", aduResponse) return } diff --git a/rtu_over_udp_client.go b/rtu_over_udp_client.go index 2a6bb51..0e448ed 100644 --- a/rtu_over_udp_client.go +++ b/rtu_over_udp_client.go @@ -3,7 +3,6 @@ package modbus import ( "fmt" "io" - logger "log/slog" "net" "sync" ) @@ -46,7 +45,7 @@ type rtuUDPTransporter struct { // Connect string Address string // Transmission logger - Logger *logger.Logger + Logger Logger // UDP connection mu sync.Mutex @@ -121,7 +120,7 @@ func (mb *rtuUDPTransporter) Send(aduRequest []byte) (aduResponse []byte, err er func (mb *rtuUDPTransporter) logf(format string, v ...interface{}) { if mb.Logger != nil { - mb.Logger.Info(format, v...) + mb.Logger.Printf(format, v...) } } diff --git a/rtuclient.go b/rtuclient.go index b4cf837..5d8d065 100644 --- a/rtuclient.go +++ b/rtuclient.go @@ -261,7 +261,7 @@ func (mb *rtuSerialTransporter) Send(aduRequest []byte) (aduResponse []byte, err mb.startCloseTimer() // Send the request - mb.Debug("modbus: send % x\n", aduRequest) + mb.logf("modbus: send % x\n", aduRequest) if _, err = mb.port.Write(aduRequest); err != nil { return } @@ -271,7 +271,7 @@ func (mb *rtuSerialTransporter) Send(aduRequest []byte) (aduResponse []byte, err time.Sleep(mb.calculateDelay(len(aduRequest) + bytesToRead)) data, err := readIncrementally(aduRequest[0], aduRequest[1], mb.port, time.Now().Add(mb.Config.Timeout)) - mb.Debug("modbus: recv % x\n", data[:]) + mb.logf("modbus: recv % x\n", data[:]) aduResponse = data return } diff --git a/serial.go b/serial.go index 178c831..3f3e53b 100644 --- a/serial.go +++ b/serial.go @@ -5,10 +5,8 @@ package modbus import ( - "context" "fmt" "io" - "log/slog" "sync" "time" @@ -26,7 +24,7 @@ type serialPort struct { // Serial port configuration. serial.Config - Logger *slog.Logger + Logger Logger IdleTimeout time.Duration mu sync.Mutex @@ -71,39 +69,9 @@ func (mb *serialPort) close() (err error) { return } -func (mb *serialPort) Debug(format string, v ...interface{}) { +func (mb *serialPort) logf(format string, v ...interface{}) { if mb.Logger != nil { - mb.Logger.Debug(format, v...) - } -} - -func (mb *serialPort) Info(format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.Info(format, v...) - } -} - -func (mb *serialPort) Error(format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.Error(format, v...) - } -} - -func (mb *serialPort) DebugContext(ctx context.Context, format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.DebugContext(ctx, format, v...) - } -} - -func (mb *serialPort) InfoContext(ctx context.Context, format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.InfoContext(ctx, format, v...) - } -} - -func (mb *serialPort) ErrorContext(ctx context.Context, format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.ErrorContext(ctx, format, v...) + mb.Logger.Printf(format, v...) } } @@ -128,7 +96,7 @@ func (mb *serialPort) closeIdle() { } if idle := time.Since(mb.lastActivity); idle >= mb.IdleTimeout { - mb.Debug("modbus: closing connection due to idle timeout: %v", idle) + mb.logf("modbus: closing connection due to idle timeout: %v", idle) mb.close() } } diff --git a/tcpclient.go b/tcpclient.go index dcb872f..d8f5da2 100644 --- a/tcpclient.go +++ b/tcpclient.go @@ -5,11 +5,9 @@ package modbus import ( - "context" "encoding/binary" "fmt" "io" - "log/slog" "net" "sync" "sync/atomic" @@ -138,7 +136,7 @@ type tcpTransporter struct { // Silent period after successful connection ConnectDelay time.Duration // Transmission logger - Logger *slog.Logger + Logger Logger // TCP connection mu sync.Mutex @@ -185,7 +183,7 @@ func (mb *tcpTransporter) Send(aduRequest []byte) (aduResponse []byte, err error return } // Send data - mb.Debug("modbus: send % x", aduRequest) + mb.logf("modbus: send % x", aduRequest) if _, err = mb.conn.Write(aduRequest); err != nil { return } @@ -203,7 +201,7 @@ func (mb *tcpTransporter) Send(aduRequest []byte) (aduResponse []byte, err error continue } - mb.Debug("modbus: close connection and retry, because of %v", err) + mb.logf("modbus: close connection and retry, because of %v", err) mb.close() time.Sleep(mb.LinkRecoveryTimeout) @@ -218,7 +216,7 @@ func (mb *tcpTransporter) readResponse(aduRequest []byte, data []byte, recoveryD if err == nil { err = verify(aduRequest, aduResponse) if err == nil { - mb.Debug("modbus: recv % x\n", aduResponse) + mb.logf("modbus: recv % x\n", aduResponse) return // everything is OK } } @@ -384,39 +382,9 @@ func (mb *tcpTransporter) flush(b []byte) (err error) { return } -func (mb *tcpTransporter) Debug(format string, v ...interface{}) { +func (mb *tcpTransporter) logf(format string, v ...interface{}) { if mb.Logger != nil { - mb.Logger.Debug(format, v...) - } -} - -func (mb *tcpTransporter) Info(format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.Info(format, v...) - } -} - -func (mb *tcpTransporter) Error(format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.Error(format, v...) - } -} - -func (mb *tcpTransporter) DebugContext(ctx context.Context, format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.DebugContext(ctx, format, v...) - } -} - -func (mb *tcpTransporter) InfoContext(ctx context.Context, format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.InfoContext(ctx, format, v...) - } -} - -func (mb *tcpTransporter) ErrorContext(ctx context.Context, format string, v ...interface{}) { - if mb.Logger != nil { - mb.Logger.ErrorContext(ctx, format, v...) + mb.Logger.Printf(format, v...) } } @@ -439,7 +407,7 @@ func (mb *tcpTransporter) closeIdle() { } if idle := time.Since(mb.lastActivity); idle >= mb.IdleTimeout { - mb.Debug("modbus: closing connection due to idle timeout: %v", idle) + mb.logf("modbus: closing connection due to idle timeout: %v", idle) mb.close() } } diff --git a/test/asciiclient_test.go b/test/asciiclient_test.go index dbef4a2..81f9048 100644 --- a/test/asciiclient_test.go +++ b/test/asciiclient_test.go @@ -5,8 +5,7 @@ package test import ( - "log/slog" - "os" + "log" "testing" "github.com/grid-x/modbus" @@ -30,7 +29,7 @@ func TestASCIIClientAdvancedUsage(t *testing.T) { handler.Parity = "E" handler.StopBits = 1 handler.SlaveID = 12 - handler.Logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) + handler.Logger = log.Default() err := handler.Connect() if err != nil { t.Fatal(err) diff --git a/test/rtu_over_tcp_client_test.go b/test/rtu_over_tcp_client_test.go index 402c38b..295b59b 100644 --- a/test/rtu_over_tcp_client_test.go +++ b/test/rtu_over_tcp_client_test.go @@ -5,8 +5,7 @@ package test import ( - "log/slog" - "os" + "log" "testing" "time" @@ -28,7 +27,7 @@ func TestRTUOverTCPClientAdvancedUsage(t *testing.T) { handler := modbus.NewRTUOverTCPClientHandler(rtuOverTCPDevice) handler.Timeout = 5 * time.Second handler.SlaveID = 1 - handler.Logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) + handler.Logger = log.Default() handler.Connect() defer handler.Close() diff --git a/test/rtuclient_test.go b/test/rtuclient_test.go index dddccb7..dd15b63 100644 --- a/test/rtuclient_test.go +++ b/test/rtuclient_test.go @@ -5,8 +5,7 @@ package test import ( - "log/slog" - "os" + "log" "testing" "github.com/grid-x/modbus" @@ -30,7 +29,7 @@ func TestRTUClientAdvancedUsage(t *testing.T) { handler.Parity = "E" handler.StopBits = 1 handler.SlaveID = 11 - handler.Logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) + handler.Logger = log.Default() err := handler.Connect() if err != nil { t.Fatal(err) diff --git a/test/tcpclient_test.go b/test/tcpclient_test.go index 0363675..d11be82 100644 --- a/test/tcpclient_test.go +++ b/test/tcpclient_test.go @@ -5,8 +5,7 @@ package test import ( - "log/slog" - "os" + "log" "testing" "time" @@ -26,7 +25,7 @@ func TestTCPClientAdvancedUsage(t *testing.T) { handler := modbus.NewTCPClientHandler(tcpDevice) handler.Timeout = 5 * time.Second handler.SlaveID = 1 - handler.Logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) + handler.Logger = log.Default() handler.Connect() defer handler.Close()