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
+}