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 <[email protected]>
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
+}


Reply via email to