You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2023/06/01 08:58:19 UTC
[plc4x] 01/02: feat(plc4go): add new WithCustomLogger option
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 3193782fb966cabfd7877bee3840c5d604e518b7
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Jun 1 10:43:51 2023 +0200
feat(plc4go): add new WithCustomLogger option
to use it call config.WithCustomLogger(log)
---
plc4go/internal/ads/Connection.go | 5 +-
plc4go/internal/ads/Driver.go | 9 +++-
plc4go/internal/bacnetip/Connection.go | 5 +-
plc4go/internal/bacnetip/Driver.go | 7 ++-
plc4go/internal/cbus/Connection.go | 4 +-
plc4go/internal/eip/EipDriver.go | 8 ++-
plc4go/internal/knxnetip/Connection.go | 2 +-
plc4go/internal/knxnetip/Driver.go | 9 +++-
plc4go/internal/modbus/Connection.go | 2 +-
plc4go/internal/modbus/ModbusAsciiDriver.go | 10 +++-
plc4go/internal/modbus/ModbusRtuDriver.go | 10 +++-
plc4go/internal/modbus/ModbusTcpDriver.go | 10 +++-
plc4go/internal/s7/Connection.go | 5 +-
plc4go/internal/s7/Driver.go | 8 ++-
plc4go/internal/simulated/Connection.go | 19 +++++---
plc4go/internal/simulated/Driver.go | 9 +++-
plc4go/pkg/api/config/config.go | 15 ++++++
plc4go/pkg/api/driverManager.go | 57 ++++++++++++----------
plc4go/pkg/api/driverManager_test.go | 5 +-
plc4go/pkg/api/drivers/drivers.go | 38 ++++++++-------
plc4go/pkg/api/logging/init.go | 7 +++
plc4go/pkg/api/transports/transports.go | 14 +++---
.../options/converter/OptionConverter.go} | 22 +++++----
23 files changed, 191 insertions(+), 89 deletions(-)
diff --git a/plc4go/internal/ads/Connection.go b/plc4go/internal/ads/Connection.go
index c2a04cca7d..e1ba92bb86 100644
--- a/plc4go/internal/ads/Connection.go
+++ b/plc4go/internal/ads/Connection.go
@@ -23,6 +23,7 @@ import (
"context"
"encoding/binary"
"fmt"
+ "github.com/apache/plc4x/plc4go/spi/options"
"strconv"
"strings"
@@ -54,7 +55,7 @@ type Connection struct {
subscriptions map[uint32]apiModel.PlcSubscriptionHandle
}
-func NewConnection(messageCodec spi.MessageCodec, configuration model.Configuration, options map[string][]string) (*Connection, error) {
+func NewConnection(messageCodec spi.MessageCodec, configuration model.Configuration, options map[string][]string, _options ...options.WithOption) (*Connection, error) {
driverContext, err := NewDriverContext(configuration)
if err != nil {
return nil, err
@@ -68,7 +69,7 @@ func NewConnection(messageCodec spi.MessageCodec, configuration model.Configurat
if traceEnabledOption, ok := options["traceEnabled"]; ok {
if len(traceEnabledOption) == 1 {
// TODO: Connection Id is probably "" all the time.
- connection.tracer = spi.NewTracer(driverContext.connectionId)
+ connection.tracer = spi.NewTracer(driverContext.connectionId, _options...)
}
}
tagHandler := NewTagHandlerWithDriverContext(driverContext)
diff --git a/plc4go/internal/ads/Driver.go b/plc4go/internal/ads/Driver.go
index c01f4024c9..44667369f0 100644
--- a/plc4go/internal/ads/Driver.go
+++ b/plc4go/internal/ads/Driver.go
@@ -21,6 +21,7 @@ package ads
import (
"context"
+ "github.com/rs/zerolog"
"net/url"
"strconv"
@@ -37,10 +38,14 @@ import (
type Driver struct {
_default.DefaultDriver
+
+ log zerolog.Logger // TODO: use it
}
-func NewDriver() plc4go.PlcDriver {
- driver := &Driver{}
+func NewDriver(_options ...options.WithOption) plc4go.PlcDriver {
+ driver := &Driver{
+ log: options.ExtractCustomLogger(_options...),
+ }
driver.DefaultDriver = _default.NewDefaultDriver(driver, "ads", "Beckhoff TwinCat ADS", "tcp", NewTagHandler())
return driver
}
diff --git a/plc4go/internal/bacnetip/Connection.go b/plc4go/internal/bacnetip/Connection.go
index 3c1bff9124..9d26f22ef4 100644
--- a/plc4go/internal/bacnetip/Connection.go
+++ b/plc4go/internal/bacnetip/Connection.go
@@ -22,6 +22,7 @@ package bacnetip
import (
"context"
"fmt"
+ "github.com/apache/plc4x/plc4go/spi/options"
"github.com/apache/plc4x/plc4go/spi/transactions"
"github.com/apache/plc4x/plc4go/spi/utils"
"github.com/pkg/errors"
@@ -47,7 +48,7 @@ type Connection struct {
tracer *spi.Tracer
}
-func NewConnection(messageCodec spi.MessageCodec, tagHandler spi.PlcTagHandler, tm transactions.RequestTransactionManager, options map[string][]string) *Connection {
+func NewConnection(messageCodec spi.MessageCodec, tagHandler spi.PlcTagHandler, tm transactions.RequestTransactionManager, options map[string][]string, _options ...options.WithOption) *Connection {
connection := &Connection{
invokeIdGenerator: InvokeIdGenerator{currentInvokeId: 0},
messageCodec: messageCodec,
@@ -55,7 +56,7 @@ func NewConnection(messageCodec spi.MessageCodec, tagHandler spi.PlcTagHandler,
}
if traceEnabledOption, ok := options["traceEnabled"]; ok {
if len(traceEnabledOption) == 1 {
- connection.tracer = spi.NewTracer(connection.connectionId)
+ connection.tracer = spi.NewTracer(connection.connectionId, _options...)
}
}
connection.DefaultConnection = _default.NewDefaultConnection(connection,
diff --git a/plc4go/internal/bacnetip/Driver.go b/plc4go/internal/bacnetip/Driver.go
index 6b72a0ccba..d5d2a57f2f 100644
--- a/plc4go/internal/bacnetip/Driver.go
+++ b/plc4go/internal/bacnetip/Driver.go
@@ -23,6 +23,7 @@ import (
"context"
"fmt"
"github.com/apache/plc4x/plc4go/spi/transactions"
+ "github.com/rs/zerolog"
"math"
"net"
"net/url"
@@ -46,9 +47,11 @@ type Driver struct {
tm transactions.RequestTransactionManager
awaitSetupComplete bool
awaitDisconnectComplete bool
+
+ log zerolog.Logger // TODO: use it
}
-func NewDriver() plc4go.PlcDriver {
+func NewDriver(_options ...options.WithOption) plc4go.PlcDriver {
driver := &Driver{
applicationManager: ApplicationManager{
applications: map[string]*ApplicationLayerMessageCodec{},
@@ -56,6 +59,8 @@ func NewDriver() plc4go.PlcDriver {
tm: transactions.NewRequestTransactionManager(math.MaxInt),
awaitSetupComplete: true,
awaitDisconnectComplete: true,
+
+ log: options.ExtractCustomLogger(_options...),
}
driver.DefaultDriver = _default.NewDefaultDriver(driver, "bacnet-ip", "BACnet/IP", "udp", NewTagHandler())
return driver
diff --git a/plc4go/internal/cbus/Connection.go b/plc4go/internal/cbus/Connection.go
index 858f32ec79..24e0ba0616 100644
--- a/plc4go/internal/cbus/Connection.go
+++ b/plc4go/internal/cbus/Connection.go
@@ -78,10 +78,12 @@ func NewConnection(messageCodec *MessageCodec, configuration Configuration, driv
configuration: configuration,
driverContext: driverContext,
tm: tm,
+
+ log: options.ExtractCustomLogger(_options...),
}
if traceEnabledOption, ok := connectionOptions["traceEnabled"]; ok {
if len(traceEnabledOption) == 1 {
- connection.tracer = spi.NewTracer(connection.connectionId)
+ connection.tracer = spi.NewTracer(connection.connectionId, _options...)
}
}
connection.DefaultConnection = _default.NewDefaultConnection(
diff --git a/plc4go/internal/eip/EipDriver.go b/plc4go/internal/eip/EipDriver.go
index e36e27904c..3d15e0de30 100644
--- a/plc4go/internal/eip/EipDriver.go
+++ b/plc4go/internal/eip/EipDriver.go
@@ -21,7 +21,9 @@ package eip
import (
"context"
+ "github.com/apache/plc4x/plc4go/spi/options"
"github.com/apache/plc4x/plc4go/spi/transactions"
+ "github.com/rs/zerolog"
"net/url"
"github.com/apache/plc4x/plc4go/pkg/api"
@@ -36,13 +38,17 @@ type Driver struct {
tm transactions.RequestTransactionManager
awaitSetupComplete bool
awaitDisconnectComplete bool
+
+ log zerolog.Logger // TODO: use it
}
-func NewDriver() plc4go.PlcDriver {
+func NewDriver(_options ...options.WithOption) plc4go.PlcDriver {
driver := &Driver{
tm: transactions.NewRequestTransactionManager(1),
awaitSetupComplete: true,
awaitDisconnectComplete: true,
+
+ log: options.ExtractCustomLogger(_options...),
}
driver.DefaultDriver = _default.NewDefaultDriver(driver, "eip", "EthernetIP", "tcp", NewTagHandler())
return driver
diff --git a/plc4go/internal/knxnetip/Connection.go b/plc4go/internal/knxnetip/Connection.go
index c3e573db8c..e9d32e70a8 100644
--- a/plc4go/internal/knxnetip/Connection.go
+++ b/plc4go/internal/knxnetip/Connection.go
@@ -190,7 +190,7 @@ func NewConnection(transportInstance transports.TransportInstance, options map[s
if traceEnabledOption, ok := options["traceEnabled"]; ok {
if len(traceEnabledOption) == 1 {
- connection.tracer = spi.NewTracer(connection.connectionId)
+ connection.tracer = spi.NewTracer(connection.connectionId, _options...)
}
}
// If a building key was provided, save that in a dedicated variable
diff --git a/plc4go/internal/knxnetip/Driver.go b/plc4go/internal/knxnetip/Driver.go
index c8131ca9cb..426b228c00 100644
--- a/plc4go/internal/knxnetip/Driver.go
+++ b/plc4go/internal/knxnetip/Driver.go
@@ -21,6 +21,7 @@ package knxnetip
import (
"context"
+ "github.com/rs/zerolog"
"net/url"
"github.com/apache/plc4x/plc4go/pkg/api"
@@ -34,10 +35,14 @@ import (
type Driver struct {
_default.DefaultDriver
+
+ log zerolog.Logger // TODO: use it
}
-func NewDriver() *Driver {
- driver := &Driver{}
+func NewDriver(_options ...options.WithOption) *Driver {
+ driver := &Driver{
+ log: options.ExtractCustomLogger(_options...),
+ }
driver.DefaultDriver = _default.NewDefaultDriver(driver, "knxnet-ip", "KNXNet/IP", "udp", NewTagHandler())
return driver
}
diff --git a/plc4go/internal/modbus/Connection.go b/plc4go/internal/modbus/Connection.go
index c2cb42731a..a2366dc59d 100644
--- a/plc4go/internal/modbus/Connection.go
+++ b/plc4go/internal/modbus/Connection.go
@@ -63,7 +63,7 @@ func NewConnection(unitIdentifier uint8, messageCodec spi.MessageCodec, options
}
if traceEnabledOption, ok := options["traceEnabled"]; ok {
if len(traceEnabledOption) == 1 {
- connection.tracer = spi.NewTracer(connection.connectionId)
+ connection.tracer = spi.NewTracer(connection.connectionId, _options...)
}
}
connection.DefaultConnection = _default.NewDefaultConnection(connection,
diff --git a/plc4go/internal/modbus/ModbusAsciiDriver.go b/plc4go/internal/modbus/ModbusAsciiDriver.go
index 7013a85e8b..d36672d072 100644
--- a/plc4go/internal/modbus/ModbusAsciiDriver.go
+++ b/plc4go/internal/modbus/ModbusAsciiDriver.go
@@ -25,8 +25,10 @@ import (
"github.com/apache/plc4x/plc4go/pkg/api"
"github.com/apache/plc4x/plc4go/protocols/modbus/readwrite/model"
_default "github.com/apache/plc4x/plc4go/spi/default"
+ "github.com/apache/plc4x/plc4go/spi/options"
"github.com/apache/plc4x/plc4go/spi/transports"
"github.com/pkg/errors"
+ "github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"net/url"
"strconv"
@@ -34,10 +36,14 @@ import (
type ModbusAsciiDriver struct {
_default.DefaultDriver
+
+ log zerolog.Logger // TODO: use it
}
-func NewModbusAsciiDriver() *ModbusAsciiDriver {
- driver := &ModbusAsciiDriver{}
+func NewModbusAsciiDriver(_options ...options.WithOption) *ModbusAsciiDriver {
+ driver := &ModbusAsciiDriver{
+ log: options.ExtractCustomLogger(_options...),
+ }
driver.DefaultDriver = _default.NewDefaultDriver(driver, "modbus-ascii", "Modbus ASCII", "serial", NewTagHandler())
return driver
}
diff --git a/plc4go/internal/modbus/ModbusRtuDriver.go b/plc4go/internal/modbus/ModbusRtuDriver.go
index 81158c362e..51bfabe649 100644
--- a/plc4go/internal/modbus/ModbusRtuDriver.go
+++ b/plc4go/internal/modbus/ModbusRtuDriver.go
@@ -25,8 +25,10 @@ import (
"github.com/apache/plc4x/plc4go/pkg/api"
"github.com/apache/plc4x/plc4go/protocols/modbus/readwrite/model"
_default "github.com/apache/plc4x/plc4go/spi/default"
+ "github.com/apache/plc4x/plc4go/spi/options"
"github.com/apache/plc4x/plc4go/spi/transports"
"github.com/pkg/errors"
+ "github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"net/url"
"strconv"
@@ -34,10 +36,14 @@ import (
type ModbusRtuDriver struct {
_default.DefaultDriver
+
+ log zerolog.Logger // TODO: use it
}
-func NewModbusRtuDriver() *ModbusRtuDriver {
- driver := &ModbusRtuDriver{}
+func NewModbusRtuDriver(_options ...options.WithOption) *ModbusRtuDriver {
+ driver := &ModbusRtuDriver{
+ log: options.ExtractCustomLogger(_options...),
+ }
driver.DefaultDriver = _default.NewDefaultDriver(driver, "modbus-rtu", "Modbus RTU", "serial", NewTagHandler())
return driver
}
diff --git a/plc4go/internal/modbus/ModbusTcpDriver.go b/plc4go/internal/modbus/ModbusTcpDriver.go
index 1e1f21d597..1633a6a71c 100644
--- a/plc4go/internal/modbus/ModbusTcpDriver.go
+++ b/plc4go/internal/modbus/ModbusTcpDriver.go
@@ -25,8 +25,10 @@ import (
"github.com/apache/plc4x/plc4go/pkg/api"
"github.com/apache/plc4x/plc4go/protocols/modbus/readwrite/model"
_default "github.com/apache/plc4x/plc4go/spi/default"
+ "github.com/apache/plc4x/plc4go/spi/options"
"github.com/apache/plc4x/plc4go/spi/transports"
"github.com/pkg/errors"
+ "github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"net/url"
"strconv"
@@ -34,10 +36,14 @@ import (
type ModbusTcpDriver struct {
_default.DefaultDriver
+
+ log zerolog.Logger // TODO: use it
}
-func NewModbusTcpDriver() *ModbusTcpDriver {
- driver := &ModbusTcpDriver{}
+func NewModbusTcpDriver(_options ...options.WithOption) *ModbusTcpDriver {
+ driver := &ModbusTcpDriver{
+ log: options.ExtractCustomLogger(_options...),
+ }
driver.DefaultDriver = _default.NewDefaultDriver(driver, "modbus-tcp", "Modbus TCP", "tcp", NewTagHandler())
return driver
}
diff --git a/plc4go/internal/s7/Connection.go b/plc4go/internal/s7/Connection.go
index 131bc31db2..579beaccad 100644
--- a/plc4go/internal/s7/Connection.go
+++ b/plc4go/internal/s7/Connection.go
@@ -22,6 +22,7 @@ package s7
import (
"context"
"fmt"
+ "github.com/apache/plc4x/plc4go/spi/options"
"github.com/apache/plc4x/plc4go/spi/transactions"
"reflect"
"strings"
@@ -67,7 +68,7 @@ type Connection struct {
tracer *spi.Tracer
}
-func NewConnection(messageCodec spi.MessageCodec, configuration Configuration, driverContext DriverContext, tagHandler spi.PlcTagHandler, tm transactions.RequestTransactionManager, options map[string][]string) *Connection {
+func NewConnection(messageCodec spi.MessageCodec, configuration Configuration, driverContext DriverContext, tagHandler spi.PlcTagHandler, tm transactions.RequestTransactionManager, options map[string][]string, _options ...options.WithOption) *Connection {
connection := &Connection{
tpduGenerator: TpduGenerator{currentTpduId: 10},
messageCodec: messageCodec,
@@ -77,7 +78,7 @@ func NewConnection(messageCodec spi.MessageCodec, configuration Configuration, d
}
if traceEnabledOption, ok := options["traceEnabled"]; ok {
if len(traceEnabledOption) == 1 {
- connection.tracer = spi.NewTracer(connection.connectionId)
+ connection.tracer = spi.NewTracer(connection.connectionId, _options...)
}
}
connection.DefaultConnection = _default.NewDefaultConnection(connection,
diff --git a/plc4go/internal/s7/Driver.go b/plc4go/internal/s7/Driver.go
index 738e6c1f1f..30277a25c7 100644
--- a/plc4go/internal/s7/Driver.go
+++ b/plc4go/internal/s7/Driver.go
@@ -21,7 +21,9 @@ package s7
import (
"context"
+ "github.com/apache/plc4x/plc4go/spi/options"
"github.com/apache/plc4x/plc4go/spi/transactions"
+ "github.com/rs/zerolog"
"net/url"
"github.com/apache/plc4x/plc4go/pkg/api"
@@ -36,13 +38,17 @@ type Driver struct {
tm transactions.RequestTransactionManager
awaitSetupComplete bool
awaitDisconnectComplete bool
+
+ log zerolog.Logger // TODO: use it
}
-func NewDriver() plc4go.PlcDriver {
+func NewDriver(_options ...options.WithOption) plc4go.PlcDriver {
driver := &Driver{
tm: transactions.NewRequestTransactionManager(1),
awaitSetupComplete: true,
awaitDisconnectComplete: true,
+
+ log: options.ExtractCustomLogger(_options...),
}
driver.DefaultDriver = _default.NewDefaultDriver(driver, "s7", "Siemens S7 (Basic)", "tcp", NewTagHandler())
return driver
diff --git a/plc4go/internal/simulated/Connection.go b/plc4go/internal/simulated/Connection.go
index 0942a30e1c..df2139d066 100644
--- a/plc4go/internal/simulated/Connection.go
+++ b/plc4go/internal/simulated/Connection.go
@@ -29,9 +29,11 @@ import (
"github.com/apache/plc4x/plc4go/spi"
_default "github.com/apache/plc4x/plc4go/spi/default"
spiModel "github.com/apache/plc4x/plc4go/spi/model"
+ "github.com/apache/plc4x/plc4go/spi/options"
"github.com/apache/plc4x/plc4go/spi/utils"
"github.com/pkg/errors"
+ "github.com/rs/zerolog"
)
type Connection struct {
@@ -42,20 +44,25 @@ type Connection struct {
connected bool
connectionId string
tracer *spi.Tracer
+
+ log zerolog.Logger
}
-func NewConnection(device *Device, tagHandler spi.PlcTagHandler, valueHandler spi.PlcValueHandler, options map[string][]string) *Connection {
+func NewConnection(device *Device, tagHandler spi.PlcTagHandler, valueHandler spi.PlcValueHandler, connectionOptions map[string][]string, _options ...options.WithOption) *Connection {
+ localLogger := options.ExtractCustomLogger(_options...)
connection := &Connection{
device: device,
tagHandler: tagHandler,
valueHandler: valueHandler,
- options: options,
+ options: connectionOptions,
connected: false,
- connectionId: utils.GenerateId(4),
+ connectionId: utils.GenerateId(localLogger, 4),
+
+ log: localLogger,
}
- if traceEnabledOption, ok := options["traceEnabled"]; ok {
+ if traceEnabledOption, ok := connectionOptions["traceEnabled"]; ok {
if len(traceEnabledOption) == 1 {
- connection.tracer = spi.NewTracer(connection.connectionId)
+ connection.tracer = spi.NewTracer(connection.connectionId, _options...)
}
}
return connection
@@ -77,7 +84,7 @@ func (c *Connection) Connect() <-chan plc4go.PlcConnectionConnectResult {
return c.ConnectWithContext(context.Background())
}
-func (c *Connection) ConnectWithContext(ctx context.Context) <-chan plc4go.PlcConnectionConnectResult {
+func (c *Connection) ConnectWithContext(_ context.Context) <-chan plc4go.PlcConnectionConnectResult {
ch := make(chan plc4go.PlcConnectionConnectResult, 1)
go func() {
defer func() {
diff --git a/plc4go/internal/simulated/Driver.go b/plc4go/internal/simulated/Driver.go
index 117c53865d..2e6110f4b8 100644
--- a/plc4go/internal/simulated/Driver.go
+++ b/plc4go/internal/simulated/Driver.go
@@ -21,6 +21,8 @@ package simulated
import (
"context"
+ "github.com/apache/plc4x/plc4go/spi/options"
+ "github.com/rs/zerolog"
"net/url"
"github.com/apache/plc4x/plc4go/pkg/api"
@@ -31,11 +33,15 @@ import (
type Driver struct {
_default.DefaultDriver
valueHandler ValueHandler
+
+ log zerolog.Logger
}
-func NewDriver() plc4go.PlcDriver {
+func NewDriver(_options ...options.WithOption) plc4go.PlcDriver {
driver := &Driver{
valueHandler: NewValueHandler(),
+
+ log: options.ExtractCustomLogger(_options...),
}
driver.DefaultDriver = _default.NewDefaultDriver(driver, "simulated", "Simulated PLC4X Datasource", "none", NewTagHandler())
return driver
@@ -43,6 +49,7 @@ func NewDriver() plc4go.PlcDriver {
func (d *Driver) GetConnectionWithContext(ctx context.Context, _ url.URL, _ map[string]transports.Transport, options map[string][]string) <-chan plc4go.PlcConnectionConnectResult {
connection := NewConnection(NewDevice("test"), d.GetPlcTagHandler(), d.valueHandler, options)
+ d.log.Debug().Msgf("Connecting and returning connection %v", connection)
return connection.ConnectWithContext(ctx)
}
diff --git a/plc4go/pkg/api/config/config.go b/plc4go/pkg/api/config/config.go
index 3800755c26..62697d442c 100644
--- a/plc4go/pkg/api/config/config.go
+++ b/plc4go/pkg/api/config/config.go
@@ -19,6 +19,11 @@
package config
+import (
+ "github.com/apache/plc4x/plc4go/spi/options"
+ "github.com/rs/zerolog"
+)
+
// TraceTransactionManagerWorkers when set to true the transaction manager displays worker states in log
var (
TraceTransactionManagerWorkers bool
@@ -30,3 +35,13 @@ var (
var (
TraceConnectionCache bool
)
+
+// WithCustomLogger is a global option to supply a custom logger
+func WithCustomLogger(logger zerolog.Logger) WithOption {
+ return options.WithCustomLogger(logger)
+}
+
+// WithOption is a marker interface for options
+type WithOption interface {
+ options.WithOption
+}
diff --git a/plc4go/pkg/api/driverManager.go b/plc4go/pkg/api/driverManager.go
index 820c44b979..50bfd297b1 100644
--- a/plc4go/pkg/api/driverManager.go
+++ b/plc4go/pkg/api/driverManager.go
@@ -21,6 +21,9 @@ package plc4go
import (
"context"
+ "github.com/apache/plc4x/plc4go/pkg/api/config"
+ "github.com/apache/plc4x/plc4go/spi/options/converter"
+ "github.com/rs/zerolog"
"net/url"
"github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -28,7 +31,6 @@ import (
"github.com/apache/plc4x/plc4go/spi/transports"
"github.com/pkg/errors"
- "github.com/rs/zerolog/log"
)
// PlcDriverManager is the main entry point for PLC4Go applications
@@ -49,11 +51,14 @@ type PlcDriverManager interface {
DiscoverWithContext(ctx context.Context, callback func(event model.PlcDiscoveryItem), discoveryOptions ...WithDiscoveryOption) error
}
-func NewPlcDriverManager() PlcDriverManager {
- log.Trace().Msg("Creating plc driver manager")
+func NewPlcDriverManager(_options ...config.WithOption) PlcDriverManager {
+ localLog := options.ExtractCustomLogger(converter.WithOptionToInternal(_options...)...)
+ localLog.Trace().Msg("Creating plc driver manager")
return &plcDriverManger{
drivers: map[string]PlcDriver{},
transports: map[string]transports.Transport{},
+
+ log: localLog,
}
}
@@ -101,6 +106,8 @@ type WithDiscoveryOption interface {
type plcDriverManger struct {
drivers map[string]PlcDriver
transports map[string]transports.Transport
+
+ log zerolog.Logger
}
type plcConnectionConnectResult struct {
@@ -139,25 +146,25 @@ func convertToInternalOptions(withDiscoveryOptions ...WithDiscoveryOption) []opt
///////////////////////////////////////
func (m *plcDriverManger) RegisterDriver(driver PlcDriver) {
- log.Debug().Str("protocolName", driver.GetProtocolName()).Msg("Registering driver")
+ m.log.Debug().Str("protocolName", driver.GetProtocolName()).Msg("Registering driver")
// If this driver is already registered, just skip resetting it
for driverName := range m.drivers {
if driverName == driver.GetProtocolCode() {
- log.Warn().Str("protocolName", driver.GetProtocolName()).Msg("Already registered")
+ m.log.Warn().Str("protocolName", driver.GetProtocolName()).Msg("Already registered")
return
}
}
m.drivers[driver.GetProtocolCode()] = driver
- log.Info().Str("protocolName", driver.GetProtocolName()).Msgf("Driver for %s registered", driver.GetProtocolName())
+ m.log.Info().Str("protocolName", driver.GetProtocolName()).Msgf("Driver for %s registered", driver.GetProtocolName())
}
func (m *plcDriverManger) ListDriverNames() []string {
- log.Trace().Msg("Listing driver names")
+ m.log.Trace().Msg("Listing driver names")
var driverNames []string
for driverName := range m.drivers {
driverNames = append(driverNames, driverName)
}
- log.Trace().Msgf("Found %d driver(s)", len(driverNames))
+ m.log.Trace().Msgf("Found %d driver(s)", len(driverNames))
return driverNames
}
@@ -169,47 +176,47 @@ func (m *plcDriverManger) GetDriver(driverName string) (PlcDriver, error) {
}
func (m *plcDriverManger) RegisterTransport(transport transports.Transport) {
- log.Debug().Str("transportName", transport.GetTransportName()).Msg("Registering transport")
+ m.log.Debug().Str("transportName", transport.GetTransportName()).Msg("Registering transport")
// If this transport is already registered, just skip resetting it
for transportName := range m.transports {
if transportName == transport.GetTransportCode() {
- log.Warn().Str("transportName", transport.GetTransportName()).Msg("Transport already registered")
+ m.log.Warn().Str("transportName", transport.GetTransportName()).Msg("Transport already registered")
return
}
}
m.transports[transport.GetTransportCode()] = transport
- log.Info().Str("transportName", transport.GetTransportName()).Msgf("Transport for %s registered", transport.GetTransportName())
+ m.log.Info().Str("transportName", transport.GetTransportName()).Msgf("Transport for %s registered", transport.GetTransportName())
}
func (m *plcDriverManger) ListTransportNames() []string {
- log.Trace().Msg("Listing transport names")
+ m.log.Trace().Msg("Listing transport names")
var transportNames []string
for transportName := range m.transports {
transportNames = append(transportNames, transportName)
}
- log.Trace().Msgf("Found %d transports", len(transportNames))
+ m.log.Trace().Msgf("Found %d transports", len(transportNames))
return transportNames
}
func (m *plcDriverManger) GetTransport(transportName string, _ string, _ map[string][]string) (transports.Transport, error) {
if val, ok := m.transports[transportName]; ok {
- log.Debug().Str("transportName", transportName).Msg("Returning transport")
+ m.log.Debug().Str("transportName", transportName).Msg("Returning transport")
return val, nil
}
return nil, errors.Errorf("couldn't find transport %s", transportName)
}
func (m *plcDriverManger) GetConnection(connectionString string) <-chan PlcConnectionConnectResult {
- log.Debug().Str("connectionString", connectionString).Msgf("Getting connection for %s", connectionString)
+ m.log.Debug().Str("connectionString", connectionString).Msgf("Getting connection for %s", connectionString)
// Parse the connection string.
connectionUrl, err := url.Parse(connectionString)
if err != nil {
- log.Error().Err(err).Msg("Error parsing connection")
+ m.log.Error().Err(err).Msg("Error parsing connection")
ch := make(chan PlcConnectionConnectResult, 1)
ch <- &plcConnectionConnectResult{err: errors.Wrap(err, "error parsing connection string")}
return ch
}
- log.Debug().Stringer("connectionUrl", connectionUrl).Msg("parsed connection URL")
+ m.log.Debug().Stringer("connectionUrl", connectionUrl).Msg("parsed connection URL")
// The options will be used to configure both the transports as well as the connections/drivers
configOptions := connectionUrl.Query()
@@ -218,12 +225,12 @@ func (m *plcDriverManger) GetConnection(connectionString string) <-chan PlcConne
driverName := connectionUrl.Scheme
driver, err := m.GetDriver(driverName)
if err != nil {
- log.Err(err).Str("driverName", driverName).Msgf("Couldn't get driver for %s", driverName)
+ m.log.Err(err).Str("driverName", driverName).Msgf("Couldn't get driver for %s", driverName)
ch := make(chan PlcConnectionConnectResult, 1)
ch <- &plcConnectionConnectResult{err: errors.Wrap(err, "error getting driver for connection string")}
return ch
}
- log.Debug().Stringer("connectionUrl", connectionUrl).Msgf("got driver %s", driver.GetProtocolName())
+ m.log.Debug().Stringer("connectionUrl", connectionUrl).Msgf("got driver %s", driver.GetProtocolName())
// If a transport is provided alongside the driver, the URL content is decoded as "opaque" data
// Then we have to re-parse that to get the transport code as well as the host & port information.
@@ -231,10 +238,10 @@ func (m *plcDriverManger) GetConnection(connectionString string) <-chan PlcConne
var transportConnectionString string
var transportPath string
if len(connectionUrl.Opaque) > 0 {
- log.Trace().Msg("we handling a opaque connectionUrl")
+ m.log.Trace().Msg("we handling a opaque connectionUrl")
connectionUrl, err := url.Parse(connectionUrl.Opaque)
if err != nil {
- log.Err(err).Str("connectionUrl.Opaque", connectionUrl.Opaque).Msg("Couldn't get transport due to parsing error")
+ m.log.Err(err).Str("connectionUrl.Opaque", connectionUrl.Opaque).Msg("Couldn't get transport due to parsing error")
ch := make(chan PlcConnectionConnectResult, 1)
ch <- &plcConnectionConnectResult{err: errors.Wrap(err, "error parsing connection string")}
return ch
@@ -243,19 +250,19 @@ func (m *plcDriverManger) GetConnection(connectionString string) <-chan PlcConne
transportConnectionString = connectionUrl.Host
transportPath = connectionUrl.Path
} else {
- log.Trace().Msg("we handling a non-opaque connectionUrl")
+ m.log.Trace().Msg("we handling a non-opaque connectionUrl")
// If no transport was provided the driver has to provide a default transport.
transportName = driver.GetDefaultTransport()
transportConnectionString = connectionUrl.Host
transportPath = connectionUrl.Path
}
- log.Debug().
+ m.log.Debug().
Str("transportName", transportName).
Str("transportConnectionString", transportConnectionString).
Msgf("got a transport %s", transportName)
// If no transport has been specified explicitly or per default, we have to abort.
if transportName == "" {
- log.Error().Msg("got a empty transport")
+ m.log.Error().Msg("got a empty transport")
ch := make(chan PlcConnectionConnectResult, 1)
ch <- &plcConnectionConnectResult{err: errors.New("no transport specified and no default defined by driver")}
return ch
@@ -267,7 +274,7 @@ func (m *plcDriverManger) GetConnection(connectionString string) <-chan PlcConne
Host: transportConnectionString,
Path: transportPath,
}
- log.Debug().Stringer("transportUrl", &transportUrl).Msg("Assembled transport url")
+ m.log.Debug().Stringer("transportUrl", &transportUrl).Msg("Assembled transport url")
// Create a new connection
return driver.GetConnection(transportUrl, m.transports, configOptions)
diff --git a/plc4go/pkg/api/driverManager_test.go b/plc4go/pkg/api/driverManager_test.go
index f5f4efed66..84f0ed9a1a 100644
--- a/plc4go/pkg/api/driverManager_test.go
+++ b/plc4go/pkg/api/driverManager_test.go
@@ -21,7 +21,9 @@ package plc4go
import (
"context"
+ "github.com/apache/plc4x/plc4go/pkg/api/config"
"github.com/apache/plc4x/plc4go/spi/utils"
+ "github.com/rs/zerolog"
"testing"
"time"
@@ -44,12 +46,13 @@ func TestNewPlcDriverManager(t *testing.T) {
want: &plcDriverManger{
drivers: map[string]PlcDriver{},
transports: map[string]transports.Transport{},
+ log: zerolog.Nop(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- if got := NewPlcDriverManager(); !assert.Equal(t, got, tt.want) {
+ if got := NewPlcDriverManager(config.WithCustomLogger(zerolog.Nop())); !assert.Equal(t, got, tt.want) {
t.Errorf("NewPlcDriverManager() = %v, want %v", got, tt.want)
}
})
diff --git a/plc4go/pkg/api/drivers/drivers.go b/plc4go/pkg/api/drivers/drivers.go
index 011a0ba8fb..8fc164b540 100644
--- a/plc4go/pkg/api/drivers/drivers.go
+++ b/plc4go/pkg/api/drivers/drivers.go
@@ -28,52 +28,54 @@ import (
modbus2 "github.com/apache/plc4x/plc4go/internal/modbus"
"github.com/apache/plc4x/plc4go/internal/s7"
"github.com/apache/plc4x/plc4go/pkg/api"
+ "github.com/apache/plc4x/plc4go/pkg/api/config"
"github.com/apache/plc4x/plc4go/pkg/api/transports"
+ "github.com/apache/plc4x/plc4go/spi/options/converter"
)
-func RegisterAdsDriver(driverManager plc4go.PlcDriverManager) {
- driverManager.RegisterDriver(ads.NewDriver())
+func RegisterAdsDriver(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.RegisterDriver(ads.NewDriver(converter.WithOptionToInternal(_options...)...))
transports.RegisterTcpTransport(driverManager)
}
-func RegisterBacnetDriver(driverManager plc4go.PlcDriverManager) {
- driverManager.RegisterDriver(bacnetip.NewDriver())
+func RegisterBacnetDriver(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.RegisterDriver(bacnetip.NewDriver(converter.WithOptionToInternal(_options...)...))
transports.RegisterUdpTransport(driverManager)
}
-func RegisterCBusDriver(driverManager plc4go.PlcDriverManager) {
- driverManager.RegisterDriver(cbus.NewDriver())
+func RegisterCBusDriver(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.RegisterDriver(cbus.NewDriver(converter.WithOptionToInternal(_options...)...))
transports.RegisterTcpTransport(driverManager)
}
-func RegisterEipDriver(driverManager plc4go.PlcDriverManager) {
- driverManager.RegisterDriver(eip.NewDriver())
+func RegisterEipDriver(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.RegisterDriver(eip.NewDriver(converter.WithOptionToInternal(_options...)...))
transports.RegisterTcpTransport(driverManager)
}
-func RegisterKnxDriver(driverManager plc4go.PlcDriverManager) {
- driverManager.RegisterDriver(knxnetip.NewDriver())
+func RegisterKnxDriver(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.RegisterDriver(knxnetip.NewDriver(converter.WithOptionToInternal(_options...)...))
transports.RegisterUdpTransport(driverManager)
}
-func RegisterModbusTcpDriver(driverManager plc4go.PlcDriverManager) {
- driverManager.RegisterDriver(modbus2.NewModbusTcpDriver())
+func RegisterModbusTcpDriver(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.RegisterDriver(modbus2.NewModbusTcpDriver(converter.WithOptionToInternal(_options...)...))
transports.RegisterTcpTransport(driverManager)
}
-func RegisterModbusRtuDriver(driverManager plc4go.PlcDriverManager) {
- driverManager.RegisterDriver(modbus2.NewModbusRtuDriver())
+func RegisterModbusRtuDriver(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.RegisterDriver(modbus2.NewModbusRtuDriver(converter.WithOptionToInternal(_options...)...))
transports.RegisterSerialTransport(driverManager)
transports.RegisterTcpTransport(driverManager)
}
-func RegisterModbusAsciiDriver(driverManager plc4go.PlcDriverManager) {
- driverManager.RegisterDriver(modbus2.NewModbusAsciiDriver())
+func RegisterModbusAsciiDriver(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.RegisterDriver(modbus2.NewModbusAsciiDriver(converter.WithOptionToInternal(_options...)...))
transports.RegisterSerialTransport(driverManager)
transports.RegisterTcpTransport(driverManager)
}
-func RegisterS7Driver(driverManager plc4go.PlcDriverManager) {
- driverManager.RegisterDriver(s7.NewDriver())
+func RegisterS7Driver(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.RegisterDriver(s7.NewDriver(converter.WithOptionToInternal(_options...)...))
transports.RegisterTcpTransport(driverManager)
}
diff --git a/plc4go/pkg/api/logging/init.go b/plc4go/pkg/api/logging/init.go
index cacb765a85..c7fb0bba6b 100644
--- a/plc4go/pkg/api/logging/init.go
+++ b/plc4go/pkg/api/logging/init.go
@@ -26,37 +26,44 @@ import (
var oldLogger zerolog.Logger
+// Deprecated: use config.WithCustomLogger
// init is used for _ imports for easy log config
func init() {
oldLogger = log.Logger
log.Logger = log.Logger.Level(zerolog.ErrorLevel)
}
+// Deprecated: use config.WithCustomLogger
// ErrorLevel configures zerolog to WarnLevel
func ErrorLevel() {
log.Logger = log.Logger.Level(zerolog.ErrorLevel)
}
+// Deprecated: use config.WithCustomLogger
// WarnLevel configures zerolog to WarnLevel
func WarnLevel() {
log.Logger = log.Logger.Level(zerolog.WarnLevel)
}
+// Deprecated: use config.WithCustomLogger
// InfoLevel configures zerolog to InfoLevel
func InfoLevel() {
log.Logger = log.Logger.Level(zerolog.InfoLevel)
}
+// Deprecated: use config.WithCustomLogger
// DebugLevel configures zerolog to DebugLevel
func DebugLevel() {
log.Logger = log.Logger.Level(zerolog.DebugLevel)
}
+// Deprecated: use config.WithCustomLogger
// TraceLevel configures zerolog to TraceLevel
func TraceLevel() {
log.Logger = log.Logger.Level(zerolog.TraceLevel)
}
+// Deprecated: use config.WithCustomLogger
// ResetLogging can be used to reset to the old log settings
func ResetLogging() {
log.Logger = oldLogger
diff --git a/plc4go/pkg/api/transports/transports.go b/plc4go/pkg/api/transports/transports.go
index 1cde90c78d..5add1287b9 100644
--- a/plc4go/pkg/api/transports/transports.go
+++ b/plc4go/pkg/api/transports/transports.go
@@ -21,20 +21,22 @@ package transports
import (
"github.com/apache/plc4x/plc4go/pkg/api"
+ "github.com/apache/plc4x/plc4go/pkg/api/config"
"github.com/apache/plc4x/plc4go/spi"
+ "github.com/apache/plc4x/plc4go/spi/options/converter"
"github.com/apache/plc4x/plc4go/spi/transports/serial"
"github.com/apache/plc4x/plc4go/spi/transports/tcp"
"github.com/apache/plc4x/plc4go/spi/transports/udp"
)
-func RegisterTcpTransport(driverManager plc4go.PlcDriverManager) {
- driverManager.(spi.TransportAware).RegisterTransport(tcp.NewTransport())
+func RegisterTcpTransport(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.(spi.TransportAware).RegisterTransport(tcp.NewTransport(converter.WithOptionToInternal(_options...)...))
}
-func RegisterUdpTransport(driverManager plc4go.PlcDriverManager) {
- driverManager.(spi.TransportAware).RegisterTransport(udp.NewTransport())
+func RegisterUdpTransport(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.(spi.TransportAware).RegisterTransport(udp.NewTransport(converter.WithOptionToInternal(_options...)...))
}
-func RegisterSerialTransport(driverManager plc4go.PlcDriverManager) {
- driverManager.(spi.TransportAware).RegisterTransport(serial.NewTransport())
+func RegisterSerialTransport(driverManager plc4go.PlcDriverManager, _options ...config.WithOption) {
+ driverManager.(spi.TransportAware).RegisterTransport(serial.NewTransport(converter.WithOptionToInternal(_options...)...))
}
diff --git a/plc4go/pkg/api/config/config.go b/plc4go/spi/options/converter/OptionConverter.go
similarity index 66%
copy from plc4go/pkg/api/config/config.go
copy to plc4go/spi/options/converter/OptionConverter.go
index 3800755c26..88b30bd1df 100644
--- a/plc4go/pkg/api/config/config.go
+++ b/plc4go/spi/options/converter/OptionConverter.go
@@ -17,16 +17,18 @@
* under the License.
*/
-package config
+package converter
-// TraceTransactionManagerWorkers when set to true the transaction manager displays worker states in log
-var (
- TraceTransactionManagerWorkers bool
- TraceTransactionManagerTransactions bool
- TraceDefaultMessageCodecWorker bool
+import (
+ "github.com/apache/plc4x/plc4go/pkg/api/config"
+ "github.com/apache/plc4x/plc4go/spi/options"
)
-// TraceConnectionCache when set to true the connection cache outputs logs by default
-var (
- TraceConnectionCache bool
-)
+// WithOptionToInternal transform API options to SPI options
+func WithOptionToInternal(_options ...config.WithOption) []options.WithOption {
+ withOptions := make([]options.WithOption, len(_options))
+ for i, option := range _options {
+ withOptions[i] = option
+ }
+ return withOptions
+}