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:18 UTC

[plc4x] branch develop updated (577d61e312 -> aa260692f3)

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


    from 577d61e312 test(plc4go/spi): code sync
     new 3193782fb9 feat(plc4go): add new WithCustomLogger option
     new aa260692f3 test(plc4go): avoid global logging in connection cache

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 plc4go/internal/ads/Connection.go                  |  10 +-
 plc4go/internal/ads/Driver.go                      |   9 +-
 plc4go/internal/bacnetip/Connection.go             |  10 +-
 plc4go/internal/bacnetip/Driver.go                 |   7 +-
 plc4go/internal/cbus/Connection.go                 |   9 +-
 plc4go/internal/cbus/Connection_test.go            |  51 ++++----
 plc4go/internal/cbus/Reader_test.go                |  45 ++++---
 plc4go/internal/eip/Connection.go                  |   5 +-
 plc4go/internal/eip/EipDriver.go                   |   8 +-
 plc4go/internal/knxnetip/Connection.go             |   7 +-
 plc4go/internal/knxnetip/Driver.go                 |   9 +-
 plc4go/internal/modbus/Connection.go               |   7 +-
 plc4go/internal/modbus/ModbusAsciiDriver.go        |  10 +-
 plc4go/internal/modbus/ModbusRtuDriver.go          |  10 +-
 plc4go/internal/modbus/ModbusTcpDriver.go          |  10 +-
 plc4go/internal/s7/Connection.go                   |  10 +-
 plc4go/internal/s7/Driver.go                       |   8 +-
 plc4go/internal/simulated/Connection.go            |  24 ++--
 plc4go/internal/simulated/Driver.go                |   9 +-
 plc4go/internal/simulated/Reader.go                |   6 +-
 plc4go/internal/simulated/Subscriber.go            |   6 +-
 plc4go/internal/simulated/Writer.go                |   6 +-
 plc4go/pkg/api/cache/PlcConnectionCache.go         |  49 ++++----
 plc4go/pkg/api/cache/PlcConnectionCache_test.go    |  43 ++++---
 plc4go/pkg/api/cache/common.go                     |  22 +++-
 plc4go/pkg/api/cache/connectionContainer.go        | 132 +++++++++++----------
 plc4go/pkg/api/cache/connectionContainer_test.go   | 127 +++++++++++++-------
 .../pkg/api/cache/mock_tracedPlcConnection_test.go |   3 +-
 .../cbus => pkg/api/cache}/noGlobalLog_test.go     |   2 +-
 plc4go/pkg/api/cache/plcConnectionLease.go         |   6 +-
 plc4go/pkg/api/cache/tracedPlcConnection.go        |   4 +-
 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 ++-
 plc4go/spi/default/DefaultConnection.go            |   9 +-
 plc4go/spi/default/DefaultConnection_test.go       |  11 +-
 .../mock_DefaultPlcConnectionCloseResult_test.go   |   3 +-
 .../converter/OptionConverter.go}                  |  27 ++---
 plc4go/spi/{ => tracer}/Tracer.go                  |  20 +++-
 plc4go/spi/{ => tracer}/Tracer_test.go             |   2 +-
 .../spi/{ => tracer}/mock_TracerProvider_test.go   |   6 +-
 plc4go/spi/utils/IdGenerator.go                    |   5 +-
 plc4go/spi/utils/IdGenerator_test.go               |   3 +-
 46 files changed, 533 insertions(+), 353 deletions(-)
 copy plc4go/{internal/cbus => pkg/api/cache}/noGlobalLog_test.go (98%)
 copy plc4go/spi/{utils/ReadBuffer_test.go => options/converter/OptionConverter.go} (67%)
 rename plc4go/spi/{ => tracer}/Tracer.go (88%)
 rename plc4go/spi/{ => tracer}/Tracer_test.go (99%)
 rename plc4go/spi/{ => tracer}/mock_TracerProvider_test.go (98%)


[plc4x] 02/02: test(plc4go): avoid global logging in connection cache

Posted by sr...@apache.org.
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 aa260692f3568461191fced8f8539c6fbb1bdd4c
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Jun 1 10:58:10 2023 +0200

    test(plc4go): avoid global logging in connection cache
---
 plc4go/internal/ads/Connection.go                  |   7 +-
 plc4go/internal/bacnetip/Connection.go             |   7 +-
 plc4go/internal/cbus/Connection.go                 |   7 +-
 plc4go/internal/cbus/Connection_test.go            |  51 ++++----
 plc4go/internal/cbus/Reader_test.go                |  45 ++++---
 plc4go/internal/eip/Connection.go                  |   5 +-
 plc4go/internal/knxnetip/Connection.go             |   7 +-
 plc4go/internal/modbus/Connection.go               |   7 +-
 plc4go/internal/s7/Connection.go                   |   7 +-
 plc4go/internal/simulated/Connection.go            |   7 +-
 plc4go/internal/simulated/Reader.go                |   6 +-
 plc4go/internal/simulated/Subscriber.go            |   6 +-
 plc4go/internal/simulated/Writer.go                |   6 +-
 plc4go/pkg/api/cache/PlcConnectionCache.go         |  49 ++++----
 plc4go/pkg/api/cache/PlcConnectionCache_test.go    |  43 ++++---
 plc4go/pkg/api/cache/common.go                     |  22 +++-
 plc4go/pkg/api/cache/connectionContainer.go        | 132 +++++++++++----------
 plc4go/pkg/api/cache/connectionContainer_test.go   | 127 +++++++++++++-------
 .../pkg/api/cache/mock_tracedPlcConnection_test.go |   3 +-
 ...{tracedPlcConnection.go => noGlobalLog_test.go} |  14 +--
 plc4go/pkg/api/cache/plcConnectionLease.go         |   6 +-
 plc4go/pkg/api/cache/tracedPlcConnection.go        |   4 +-
 plc4go/spi/default/DefaultConnection.go            |   9 +-
 plc4go/spi/default/DefaultConnection_test.go       |  11 +-
 .../mock_DefaultPlcConnectionCloseResult_test.go   |   3 +-
 plc4go/spi/{ => tracer}/Tracer.go                  |  20 +++-
 plc4go/spi/{ => tracer}/Tracer_test.go             |   2 +-
 .../spi/{ => tracer}/mock_TracerProvider_test.go   |   6 +-
 plc4go/spi/utils/IdGenerator.go                    |   5 +-
 plc4go/spi/utils/IdGenerator_test.go               |   3 +-
 30 files changed, 355 insertions(+), 272 deletions(-)

diff --git a/plc4go/internal/ads/Connection.go b/plc4go/internal/ads/Connection.go
index e1ba92bb86..3e08d7ad8d 100644
--- a/plc4go/internal/ads/Connection.go
+++ b/plc4go/internal/ads/Connection.go
@@ -24,6 +24,7 @@ import (
 	"encoding/binary"
 	"fmt"
 	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"strconv"
 	"strings"
 
@@ -50,7 +51,7 @@ type Connection struct {
 	requestInterceptor interceptors.RequestInterceptor
 	configuration      model.Configuration
 	driverContext      *DriverContext
-	tracer             *spi.Tracer
+	tracer             *tracer.Tracer
 
 	subscriptions map[uint32]apiModel.PlcSubscriptionHandle
 }
@@ -69,7 +70,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, _options...)
+			connection.tracer = tracer.NewTracer(driverContext.connectionId, _options...)
 		}
 	}
 	tagHandler := NewTagHandlerWithDriverContext(driverContext)
@@ -89,7 +90,7 @@ func (m *Connection) IsTraceEnabled() bool {
 	return m.tracer != nil
 }
 
-func (m *Connection) GetTracer() *spi.Tracer {
+func (m *Connection) GetTracer() *tracer.Tracer {
 	return m.tracer
 }
 
diff --git a/plc4go/internal/bacnetip/Connection.go b/plc4go/internal/bacnetip/Connection.go
index 9d26f22ef4..97791c09e2 100644
--- a/plc4go/internal/bacnetip/Connection.go
+++ b/plc4go/internal/bacnetip/Connection.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"fmt"
 	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 	"github.com/pkg/errors"
@@ -45,7 +46,7 @@ type Connection struct {
 	tm                transactions.RequestTransactionManager
 
 	connectionId string
-	tracer       *spi.Tracer
+	tracer       *tracer.Tracer
 }
 
 func NewConnection(messageCodec spi.MessageCodec, tagHandler spi.PlcTagHandler, tm transactions.RequestTransactionManager, options map[string][]string, _options ...options.WithOption) *Connection {
@@ -56,7 +57,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, _options...)
+			connection.tracer = tracer.NewTracer(connection.connectionId, _options...)
 		}
 	}
 	connection.DefaultConnection = _default.NewDefaultConnection(connection,
@@ -74,7 +75,7 @@ func (c *Connection) IsTraceEnabled() bool {
 	return c.tracer != nil
 }
 
-func (c *Connection) GetTracer() *spi.Tracer {
+func (c *Connection) GetTracer() *tracer.Tracer {
 	return c.tracer
 }
 
diff --git a/plc4go/internal/cbus/Connection.go b/plc4go/internal/cbus/Connection.go
index 24e0ba0616..ec500374f8 100644
--- a/plc4go/internal/cbus/Connection.go
+++ b/plc4go/internal/cbus/Connection.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"fmt"
 	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
 	"sync"
@@ -66,7 +67,7 @@ type Connection struct {
 	driverContext DriverContext
 
 	connectionId string
-	tracer       *spi.Tracer
+	tracer       *tracer.Tracer
 
 	log zerolog.Logger
 }
@@ -83,7 +84,7 @@ func NewConnection(messageCodec *MessageCodec, configuration Configuration, driv
 	}
 	if traceEnabledOption, ok := connectionOptions["traceEnabled"]; ok {
 		if len(traceEnabledOption) == 1 {
-			connection.tracer = spi.NewTracer(connection.connectionId, _options...)
+			connection.tracer = tracer.NewTracer(connection.connectionId, _options...)
 		}
 	}
 	connection.DefaultConnection = _default.NewDefaultConnection(
@@ -104,7 +105,7 @@ func (c *Connection) IsTraceEnabled() bool {
 	return c.tracer != nil
 }
 
-func (c *Connection) GetTracer() *spi.Tracer {
+func (c *Connection) GetTracer() *tracer.Tracer {
 	return c.tracer
 }
 
diff --git a/plc4go/internal/cbus/Connection_test.go b/plc4go/internal/cbus/Connection_test.go
index 80d0e04a71..657d30a0f8 100644
--- a/plc4go/internal/cbus/Connection_test.go
+++ b/plc4go/internal/cbus/Connection_test.go
@@ -28,6 +28,7 @@ import (
 	_default "github.com/apache/plc4x/plc4go/spi/default"
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/testutils"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/apache/plc4x/plc4go/spi/transports"
 	"github.com/apache/plc4x/plc4go/spi/transports/test"
@@ -93,7 +94,7 @@ func TestConnection_BrowseRequestBuilder(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -138,7 +139,7 @@ func TestConnection_ConnectWithContext(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -240,7 +241,7 @@ func TestConnection_GetConnection(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -282,7 +283,7 @@ func TestConnection_GetConnectionId(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -321,7 +322,7 @@ func TestConnection_GetMessageCodec(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -364,7 +365,7 @@ func TestConnection_GetMetadata(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -410,13 +411,13 @@ func TestConnection_GetTracer(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
 		name   string
 		fields fields
-		want   *spi.Tracer
+		want   *tracer.Tracer
 	}{
 		{
 			name: "just nil",
@@ -449,7 +450,7 @@ func TestConnection_IsTraceEnabled(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -488,7 +489,7 @@ func TestConnection_ReadRequestBuilder(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -533,7 +534,7 @@ func TestConnection_String(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -573,7 +574,7 @@ func TestConnection_SubscriptionRequestBuilder(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -618,7 +619,7 @@ func TestConnection_UnsubscriptionRequestBuilder(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -657,7 +658,7 @@ func TestConnection_WriteRequestBuilder(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
@@ -702,7 +703,7 @@ func TestConnection_addSubscriber(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -759,7 +760,7 @@ func TestConnection_fireConnected(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -823,7 +824,7 @@ func TestConnection_fireConnectionError(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -936,7 +937,7 @@ func TestConnection_sendCalDataWrite(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -1028,7 +1029,7 @@ func TestConnection_sendReset(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -1117,7 +1118,7 @@ func TestConnection_setApplicationFilter(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -1206,7 +1207,7 @@ func TestConnection_setInterface1PowerUpSettings(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -1295,7 +1296,7 @@ func TestConnection_setInterfaceOptions1(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -1384,7 +1385,7 @@ func TestConnection_setInterfaceOptions3(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -1473,7 +1474,7 @@ func TestConnection_setupConnection(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	type args struct {
@@ -1938,7 +1939,7 @@ func TestConnection_startSubscriptionHandler(t *testing.T) {
 		configuration     Configuration
 		driverContext     DriverContext
 		connectionId      string
-		tracer            *spi.Tracer
+		tracer            *tracer.Tracer
 		log               zerolog.Logger
 	}
 	tests := []struct {
diff --git a/plc4go/internal/cbus/Reader_test.go b/plc4go/internal/cbus/Reader_test.go
index c9a5cb4903..646e5e04a2 100644
--- a/plc4go/internal/cbus/Reader_test.go
+++ b/plc4go/internal/cbus/Reader_test.go
@@ -420,29 +420,6 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 			name: "Send message empty message",
 			fields: fields{
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
-				messageCodec: func() *MessageCodec {
-					transport := test.NewTransport()
-					transportUrl := url.URL{Scheme: "test"}
-					transportInstance, err := transport.CreateTransportInstance(transportUrl, nil)
-					if err != nil {
-						t.Error(err)
-						t.FailNow()
-						return nil
-					}
-					codec := NewMessageCodec(transportInstance)
-					t.Cleanup(func() {
-						if err := codec.Disconnect(); err != nil {
-							t.Error(err)
-						}
-					})
-					err = codec.Connect()
-					if err != nil {
-						t.Error(err)
-						t.FailNow()
-						return nil
-					}
-					return codec
-				}(),
 			},
 			args: args{
 				ctx: func() context.Context {
@@ -468,6 +445,28 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				},
 			},
 			setup: func(t *testing.T, fields *fields, args *args) {
+				loggerOption := options.WithCustomLogger(testutils.ProduceTestingLogger(t))
+
+				transport := test.NewTransport(loggerOption)
+				transportUrl := url.URL{Scheme: "test"}
+				transportInstance, err := transport.CreateTransportInstance(transportUrl, nil, loggerOption)
+				if err != nil {
+					t.Error(err)
+					t.FailNow()
+				}
+				codec := NewMessageCodec(transportInstance, loggerOption)
+				t.Cleanup(func() {
+					if err := codec.Disconnect(); err != nil {
+						t.Error(err)
+					}
+				})
+				err = codec.Connect()
+				if err != nil {
+					t.Error(err)
+					t.FailNow()
+				}
+				fields.messageCodec = codec
+
 				transaction := NewMockRequestTransaction(t)
 				expect := transaction.EXPECT()
 				expect.FailRequest(mock.Anything).Return(errors.New("no I say"))
diff --git a/plc4go/internal/eip/Connection.go b/plc4go/internal/eip/Connection.go
index 2524e333db..418922e563 100644
--- a/plc4go/internal/eip/Connection.go
+++ b/plc4go/internal/eip/Connection.go
@@ -22,6 +22,7 @@ package eip
 import (
 	"context"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 
 	"github.com/apache/plc4x/plc4go/pkg/api"
@@ -56,7 +57,7 @@ type Connection struct {
 	useMessageRouter          bool
 	useConnectionManager      bool
 	routingAddress            []readWriteModel.PathSegment
-	tracer                    *spi.Tracer
+	tracer                    *tracer.Tracer
 }
 
 func NewConnection(messageCodec spi.MessageCodec, configuration Configuration, driverContext DriverContext, tagHandler spi.PlcTagHandler, tm transactions.RequestTransactionManager, options map[string][]string) *Connection {
@@ -91,7 +92,7 @@ func (m *Connection) IsTraceEnabled() bool {
 	return m.tracer != nil
 }
 
-func (m *Connection) GetTracer() *spi.Tracer {
+func (m *Connection) GetTracer() *tracer.Tracer {
 	return m.tracer
 }
 
diff --git a/plc4go/internal/knxnetip/Connection.go b/plc4go/internal/knxnetip/Connection.go
index e9d32e70a8..9646c73672 100644
--- a/plc4go/internal/knxnetip/Connection.go
+++ b/plc4go/internal/knxnetip/Connection.go
@@ -25,6 +25,7 @@ import (
 	"encoding/hex"
 	"fmt"
 	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"strconv"
 	"strings"
 	"sync"
@@ -134,7 +135,7 @@ type Connection struct {
 	handleTunnelingRequests bool
 
 	connectionId string
-	tracer       *spi.Tracer
+	tracer       *tracer.Tracer
 }
 
 func (m *Connection) String() string {
@@ -190,7 +191,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, _options...)
+			connection.tracer = tracer.NewTracer(connection.connectionId, _options...)
 		}
 	}
 	// If a building key was provided, save that in a dedicated variable
@@ -212,7 +213,7 @@ func (m *Connection) IsTraceEnabled() bool {
 	return m.tracer != nil
 }
 
-func (m *Connection) GetTracer() *spi.Tracer {
+func (m *Connection) GetTracer() *tracer.Tracer {
 	return m.tracer
 }
 
diff --git a/plc4go/internal/modbus/Connection.go b/plc4go/internal/modbus/Connection.go
index a2366dc59d..55a93f5120 100644
--- a/plc4go/internal/modbus/Connection.go
+++ b/plc4go/internal/modbus/Connection.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"fmt"
 	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/pkg/api"
@@ -45,7 +46,7 @@ type Connection struct {
 	requestInterceptor interceptors.RequestInterceptor
 
 	connectionId string
-	tracer       *spi.Tracer
+	tracer       *tracer.Tracer
 }
 
 func NewConnection(unitIdentifier uint8, messageCodec spi.MessageCodec, options map[string][]string, tagHandler spi.PlcTagHandler, _options ...options.WithOption) *Connection {
@@ -63,7 +64,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, _options...)
+			connection.tracer = tracer.NewTracer(connection.connectionId, _options...)
 		}
 	}
 	connection.DefaultConnection = _default.NewDefaultConnection(connection,
@@ -82,7 +83,7 @@ func (m *Connection) IsTraceEnabled() bool {
 	return m.tracer != nil
 }
 
-func (m *Connection) GetTracer() *spi.Tracer {
+func (m *Connection) GetTracer() *tracer.Tracer {
 	return m.tracer
 }
 
diff --git a/plc4go/internal/s7/Connection.go b/plc4go/internal/s7/Connection.go
index 579beaccad..29e9f92232 100644
--- a/plc4go/internal/s7/Connection.go
+++ b/plc4go/internal/s7/Connection.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"fmt"
 	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"reflect"
 	"strings"
@@ -65,7 +66,7 @@ type Connection struct {
 	tm            transactions.RequestTransactionManager
 
 	connectionId string
-	tracer       *spi.Tracer
+	tracer       *tracer.Tracer
 }
 
 func NewConnection(messageCodec spi.MessageCodec, configuration Configuration, driverContext DriverContext, tagHandler spi.PlcTagHandler, tm transactions.RequestTransactionManager, options map[string][]string, _options ...options.WithOption) *Connection {
@@ -78,7 +79,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, _options...)
+			connection.tracer = tracer.NewTracer(connection.connectionId, _options...)
 		}
 	}
 	connection.DefaultConnection = _default.NewDefaultConnection(connection,
@@ -96,7 +97,7 @@ func (m *Connection) IsTraceEnabled() bool {
 	return m.tracer != nil
 }
 
-func (m *Connection) GetTracer() *spi.Tracer {
+func (m *Connection) GetTracer() *tracer.Tracer {
 	return m.tracer
 }
 
diff --git a/plc4go/internal/simulated/Connection.go b/plc4go/internal/simulated/Connection.go
index df2139d066..f429056a1a 100644
--- a/plc4go/internal/simulated/Connection.go
+++ b/plc4go/internal/simulated/Connection.go
@@ -21,6 +21,7 @@ package simulated
 
 import (
 	"context"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"strconv"
 	"time"
 
@@ -43,7 +44,7 @@ type Connection struct {
 	options      map[string][]string
 	connected    bool
 	connectionId string
-	tracer       *spi.Tracer
+	tracer       *tracer.Tracer
 
 	log zerolog.Logger
 }
@@ -62,7 +63,7 @@ func NewConnection(device *Device, tagHandler spi.PlcTagHandler, valueHandler sp
 	}
 	if traceEnabledOption, ok := connectionOptions["traceEnabled"]; ok {
 		if len(traceEnabledOption) == 1 {
-			connection.tracer = spi.NewTracer(connection.connectionId, _options...)
+			connection.tracer = tracer.NewTracer(connection.connectionId, _options...)
 		}
 	}
 	return connection
@@ -76,7 +77,7 @@ func (c *Connection) IsTraceEnabled() bool {
 	return c.tracer != nil
 }
 
-func (c *Connection) GetTracer() *spi.Tracer {
+func (c *Connection) GetTracer() *tracer.Tracer {
 	return c.tracer
 }
 
diff --git a/plc4go/internal/simulated/Reader.go b/plc4go/internal/simulated/Reader.go
index 4be8926393..3958fc2ebc 100644
--- a/plc4go/internal/simulated/Reader.go
+++ b/plc4go/internal/simulated/Reader.go
@@ -21,23 +21,23 @@ package simulated
 
 import (
 	"context"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/pkg/errors"
 	"strconv"
 	"time"
 
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
 	apiValues "github.com/apache/plc4x/plc4go/pkg/api/values"
-	"github.com/apache/plc4x/plc4go/spi"
 	spiModel "github.com/apache/plc4x/plc4go/spi/model"
 )
 
 type Reader struct {
 	device  *Device
 	options map[string][]string
-	tracer  *spi.Tracer
+	tracer  *tracer.Tracer
 }
 
-func NewReader(device *Device, options map[string][]string, tracer *spi.Tracer) *Reader {
+func NewReader(device *Device, options map[string][]string, tracer *tracer.Tracer) *Reader {
 	return &Reader{
 		device:  device,
 		options: options,
diff --git a/plc4go/internal/simulated/Subscriber.go b/plc4go/internal/simulated/Subscriber.go
index 7bda6bad18..30f7b6a196 100644
--- a/plc4go/internal/simulated/Subscriber.go
+++ b/plc4go/internal/simulated/Subscriber.go
@@ -22,18 +22,18 @@ package simulated
 import (
 	"context"
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-	"github.com/apache/plc4x/plc4go/spi"
 	spiModel "github.com/apache/plc4x/plc4go/spi/model"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/pkg/errors"
 )
 
 type Subscriber struct {
 	device  *Device
 	options map[string][]string
-	tracer  *spi.Tracer
+	tracer  *tracer.Tracer
 }
 
-func NewSubscriber(device *Device, options map[string][]string, tracer *spi.Tracer) *Subscriber {
+func NewSubscriber(device *Device, options map[string][]string, tracer *tracer.Tracer) *Subscriber {
 	return &Subscriber{
 		device:  device,
 		options: options,
diff --git a/plc4go/internal/simulated/Writer.go b/plc4go/internal/simulated/Writer.go
index 08dfa93836..44f39a86cb 100644
--- a/plc4go/internal/simulated/Writer.go
+++ b/plc4go/internal/simulated/Writer.go
@@ -21,22 +21,22 @@ package simulated
 
 import (
 	"context"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/pkg/errors"
 	"strconv"
 	"time"
 
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-	"github.com/apache/plc4x/plc4go/spi"
 	spiModel "github.com/apache/plc4x/plc4go/spi/model"
 )
 
 type Writer struct {
 	device  *Device
 	options map[string][]string
-	tracer  *spi.Tracer
+	tracer  *tracer.Tracer
 }
 
-func NewWriter(device *Device, options map[string][]string, tracer *spi.Tracer) *Writer {
+func NewWriter(device *Device, options map[string][]string, tracer *tracer.Tracer) *Writer {
 	return &Writer{
 		device:  device,
 		options: options,
diff --git a/plc4go/pkg/api/cache/PlcConnectionCache.go b/plc4go/pkg/api/cache/PlcConnectionCache.go
index 5033028639..ec17b955b7 100644
--- a/plc4go/pkg/api/cache/PlcConnectionCache.go
+++ b/plc4go/pkg/api/cache/PlcConnectionCache.go
@@ -23,12 +23,12 @@ import (
 	"fmt"
 	"github.com/apache/plc4x/plc4go/pkg/api"
 	"github.com/apache/plc4x/plc4go/pkg/api/config"
-	"github.com/apache/plc4x/plc4go/spi"
 	_default "github.com/apache/plc4x/plc4go/spi/default"
+	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
-	"github.com/rs/zerolog/log"
 	"github.com/viney-shih/go-lock"
 	"time"
 )
@@ -39,13 +39,13 @@ type PlcConnectionCache interface {
 }
 
 func NewPlcConnectionCache(driverManager plc4go.PlcDriverManager, withConnectionCacheOptions ...WithConnectionCacheOption) PlcConnectionCache {
-	cacheLog := log.Logger
+	var log zerolog.Logger
 	if !config.TraceConnectionCache {
-		cacheLog = zerolog.Nop()
+		log = zerolog.Nop()
 	}
 	maxLeaseTime := time.Second * 5
 	cc := &plcConnectionCache{
-		cacheLog:      cacheLog,
+		log:           log,
 		driverManager: driverManager,
 		maxLeaseTime:  maxLeaseTime,
 		maxWaitTime:   maxLeaseTime * 5,
@@ -79,9 +79,14 @@ func WithTracer() WithConnectionCacheOption {
 	}
 }
 
+// Deprecated: use WithCustomLogger
 func WithLogger(logger zerolog.Logger) WithConnectionCacheOption {
+	return WithCustomLogger(logger)
+}
+
+func WithCustomLogger(logger zerolog.Logger) WithConnectionCacheOption {
 	return func(plcConnectionCache *plcConnectionCache) {
-		plcConnectionCache.cacheLog = logger
+		plcConnectionCache.log = logger
 	}
 }
 
@@ -92,8 +97,6 @@ func WithLogger(logger zerolog.Logger) WithConnectionCacheOption {
 //
 
 type plcConnectionCache struct {
-	cacheLog zerolog.Logger
-
 	driverManager plc4go.PlcDriverManager
 
 	// Maximum duration a connection can be used per lease.
@@ -103,7 +106,9 @@ type plcConnectionCache struct {
 
 	cacheLock   lock.RWMutex
 	connections map[string]*connectionContainer
-	tracer      *spi.Tracer
+	tracer      *tracer.Tracer
+
+	log zerolog.Logger
 }
 
 func (t *plcConnectionCache) onConnectionEvent(event connectionEvent) {
@@ -112,7 +117,7 @@ func (t *plcConnectionCache) onConnectionEvent(event connectionEvent) {
 		if t.tracer != nil {
 			t.tracer.AddTrace("destroy-connection", errorEvent.getError().Error())
 		}
-		t.cacheLog.Debug().Str("connectionString", connectionContainerInstance.connectionString)
+		t.log.Debug().Str("connectionString", connectionContainerInstance.connectionString)
 	}
 }
 
@@ -123,10 +128,10 @@ func (t *plcConnectionCache) onConnectionEvent(event connectionEvent) {
 ///////////////////////////////////////
 
 func (t *plcConnectionCache) EnableTracer() {
-	t.tracer = spi.NewTracer("cache")
+	t.tracer = tracer.NewTracer("cache", options.WithCustomLogger(t.log))
 }
 
-func (t *plcConnectionCache) GetTracer() *spi.Tracer {
+func (t *plcConnectionCache) GetTracer() *tracer.Tracer {
 	return t.tracer
 }
 
@@ -142,9 +147,9 @@ func (t *plcConnectionCache) GetConnection(connectionString string) <-chan plc4g
 			if t.tracer != nil {
 				t.tracer.AddTrace("get-connection", "create new cached connection")
 			}
-			t.cacheLog.Debug().Str("connectionString", connectionString).Msg("Create new cached connection")
+			t.log.Debug().Str("connectionString", connectionString).Msg("Create new cached connection")
 			// Create a new connection container.
-			cc := newConnectionContainer(&t.cacheLog, t.driverManager, connectionString)
+			cc := newConnectionContainer(t.log, t.driverManager, connectionString)
 			// Register for connection events (Like connection closed or error).
 			cc.addListener(t)
 			// Store the new connection container in the cache of connections.
@@ -172,7 +177,7 @@ func (t *plcConnectionCache) GetConnection(connectionString string) <-chan plc4g
 		select {
 		// Wait till we get a lease.
 		case connectionResponse := <-leaseChan:
-			t.cacheLog.Debug().Str("connectionString", connectionString).Msg("Successfully got lease to connection")
+			t.log.Debug().Str("connectionString", connectionString).Msg("Successfully got lease to connection")
 			responseTimeout := time.NewTimer(10 * time.Millisecond)
 			defer utils.CleanupTimer(responseTimeout)
 			select {
@@ -186,7 +191,7 @@ func (t *plcConnectionCache) GetConnection(connectionString string) <-chan plc4g
 					t.tracer.AddTransactionalTrace(txId, "get-connection", "client given up")
 				}
 				close(ch)
-				t.cacheLog.Debug().Str("connectionString", connectionString).Msg("Client not available returning connection to cache.")
+				t.log.Debug().Str("connectionString", connectionString).Msg("Client not available returning connection to cache.")
 				// Return the connection to give another connection the chance to use it.
 				if connectionResponse.GetConnection() != nil {
 					connectionResponse.GetConnection().Close()
@@ -203,7 +208,7 @@ func (t *plcConnectionCache) GetConnection(connectionString string) <-chan plc4g
 			if t.tracer != nil {
 				t.tracer.AddTransactionalTrace(txId, "get-connection", "timeout")
 			}
-			t.cacheLog.Debug().Str("connectionString", connectionString).Msg("Timeout while waiting for connection.")
+			t.log.Debug().Str("connectionString", connectionString).Msg("Timeout while waiting for connection.")
 			ch <- _default.NewDefaultPlcConnectionCloseResult(nil, errors.New("timeout while waiting for connection"))
 		}
 	}()
@@ -212,7 +217,7 @@ func (t *plcConnectionCache) GetConnection(connectionString string) <-chan plc4g
 }
 
 func (t *plcConnectionCache) Close() <-chan PlcConnectionCacheCloseResult {
-	t.cacheLog.Debug().Msg("Closing connection cache started.")
+	t.log.Debug().Msg("Closing connection cache started.")
 	ch := make(chan PlcConnectionCacheCloseResult)
 
 	go func() {
@@ -226,7 +231,7 @@ func (t *plcConnectionCache) Close() <-chan PlcConnectionCacheCloseResult {
 			case ch <- newDefaultPlcConnectionCacheCloseResult(t, nil):
 			case <-responseDeliveryTimeout.C:
 			}
-			t.cacheLog.Debug().Msg("Closing connection cache finished.")
+			t.log.Debug().Msg("Closing connection cache finished.")
 			return
 		}
 
@@ -244,14 +249,14 @@ func (t *plcConnectionCache) Close() <-chan PlcConnectionCacheCloseResult {
 				// We also really don't care if it worked, or not ... it's just an attempt of being
 				// nice.
 				case _ = <-leaseResults:
-					t.cacheLog.Debug().Str("connectionString", container.connectionString).Msg("Gracefully closing connection ...")
+					t.log.Debug().Str("connectionString", container.connectionString).Msg("Gracefully closing connection ...")
 					// Give back the connection.
 					if container.connection != nil {
 						container.connection.Close()
 					}
 				// If we're timing out brutally kill the connection.
 				case <-closeTimeout.C:
-					t.cacheLog.Debug().Str("connectionString", container.connectionString).Msg("Forcefully closing connection ...")
+					t.log.Debug().Str("connectionString", container.connectionString).Msg("Forcefully closing connection ...")
 					// Forcefully close this connection.
 					if container.connection != nil {
 						container.connection.Close()
@@ -264,7 +269,7 @@ func (t *plcConnectionCache) Close() <-chan PlcConnectionCacheCloseResult {
 				case ch <- newDefaultPlcConnectionCacheCloseResult(t, nil):
 				case <-responseDeliveryTimeout.C:
 				}
-				t.cacheLog.Debug().Msg("Closing connection cache finished.")
+				t.log.Debug().Msg("Closing connection cache finished.")
 			}(cc)
 		}
 	}()
diff --git a/plc4go/pkg/api/cache/PlcConnectionCache_test.go b/plc4go/pkg/api/cache/PlcConnectionCache_test.go
index 8dd79ce4ab..efb73750c2 100644
--- a/plc4go/pkg/api/cache/PlcConnectionCache_test.go
+++ b/plc4go/pkg/api/cache/PlcConnectionCache_test.go
@@ -20,12 +20,15 @@
 package cache
 
 import (
+	"github.com/apache/plc4x/plc4go/pkg/api/config"
+	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/testutils"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"testing"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/internal/simulated"
 	"github.com/apache/plc4x/plc4go/pkg/api"
-	"github.com/apache/plc4x/plc4go/spi"
 	_default "github.com/apache/plc4x/plc4go/spi/default"
 	"github.com/stretchr/testify/assert"
 	"github.com/viney-shih/go-lock"
@@ -44,41 +47,45 @@ func TestPlcConnectionCache_GetConnection(t *testing.T) {
 		name        string
 		fields      fields
 		args        args
+		setup       func(t *testing.T, fields *fields, args *args)
 		wantErr     bool
 		wantTimeout bool
 	}{
 		{
 			name: "simple",
-			fields: fields{
-				driverManager: func() plc4go.PlcDriverManager {
-					driverManager := plc4go.NewPlcDriverManager()
-					driverManager.RegisterDriver(simulated.NewDriver())
-					return driverManager
-				}(),
-			}, args: args{
+			args: args{
 				connectionString: "simulated://1.2.3.4:42",
 			},
+			setup: func(t *testing.T, fields *fields, args *args) {
+				logger := testutils.ProduceTestingLogger(t)
+				driverManager := plc4go.NewPlcDriverManager(config.WithCustomLogger(logger))
+				driverManager.RegisterDriver(simulated.NewDriver(options.WithCustomLogger(logger)))
+				fields.driverManager = driverManager
+			},
 			wantErr:     false,
 			wantTimeout: false,
 		},
 		{
 			name: "simpleWithTimeout",
-			fields: fields{
-				driverManager: func() plc4go.PlcDriverManager {
-					driverManager := plc4go.NewPlcDriverManager()
-					driverManager.RegisterDriver(simulated.NewDriver())
-					return driverManager
-				}(),
-			}, args: args{
+			args: args{
 				connectionString: "simulated://1.2.3.4:42?connectionDelay=5",
 			},
+			setup: func(t *testing.T, fields *fields, args *args) {
+				logger := testutils.ProduceTestingLogger(t)
+				driverManager := plc4go.NewPlcDriverManager(config.WithCustomLogger(logger))
+				driverManager.RegisterDriver(simulated.NewDriver(options.WithCustomLogger(logger)))
+				fields.driverManager = driverManager
+			},
 			wantErr:     false,
 			wantTimeout: true,
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			cc := NewPlcConnectionCache(tt.fields.driverManager)
+			if tt.setup != nil {
+				tt.setup(t, &tt.fields, &tt.args)
+			}
+			cc := NewPlcConnectionCache(tt.fields.driverManager, WithCustomLogger(testutils.ProduceTestingLogger(t)))
 			got := cc.GetConnection(tt.args.connectionString)
 			select {
 			case connectResult := <-got:
@@ -182,8 +189,8 @@ func TestPlcConnectionCache_Close(t *testing.T) {
 	}
 }
 
-func readFromPlc(t *testing.T, cache plcConnectionCache, connectionString string, resourceString string) <-chan []spi.TraceEntry {
-	ch := make(chan []spi.TraceEntry)
+func readFromPlc(t *testing.T, cache plcConnectionCache, connectionString string, resourceString string) <-chan []tracer.TraceEntry {
+	ch := make(chan []tracer.TraceEntry)
 
 	// Get a connection
 	connectionResultChan := cache.GetConnection(connectionString)
diff --git a/plc4go/pkg/api/cache/common.go b/plc4go/pkg/api/cache/common.go
index 906f15778c..9bd3b584d8 100644
--- a/plc4go/pkg/api/cache/common.go
+++ b/plc4go/pkg/api/cache/common.go
@@ -19,6 +19,17 @@
 
 package cache
 
+type PlcConnectionCacheCloseResult interface {
+	GetConnectionCache() PlcConnectionCache
+	GetErr() error
+}
+
+///////////////////////////////////////
+///////////////////////////////////////
+//
+// Internal section
+//
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // cachedPlcConnectionState
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -77,11 +88,6 @@ func (c connectionErrorEvent) getError() error {
 // PlcConnectionCacheCloseResult / plcConnectionCacheCloseResult
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-type PlcConnectionCacheCloseResult interface {
-	GetConnectionCache() PlcConnectionCache
-	GetErr() error
-}
-
 type plcConnectionCacheCloseResult struct {
 	connectionCache PlcConnectionCache
 	err             error
@@ -101,3 +107,9 @@ func (p plcConnectionCacheCloseResult) GetConnectionCache() PlcConnectionCache {
 func (p plcConnectionCacheCloseResult) GetErr() error {
 	return p.err
 }
+
+//
+// Internal section
+//
+///////////////////////////////////////
+///////////////////////////////////////
diff --git a/plc4go/pkg/api/cache/connectionContainer.go b/plc4go/pkg/api/cache/connectionContainer.go
index faca8d3606..18987eaafa 100644
--- a/plc4go/pkg/api/cache/connectionContainer.go
+++ b/plc4go/pkg/api/cache/connectionContainer.go
@@ -29,7 +29,6 @@ import (
 )
 
 type connectionContainer struct {
-	cacheLog         *zerolog.Logger
 	lock             lock.RWMutex
 	connectionString string
 	driverManager    plc4go.PlcDriverManager
@@ -43,11 +42,12 @@ type connectionContainer struct {
 	queue []chan plc4go.PlcConnectionConnectResult
 	// Listeners for connection events.
 	listeners []connectionListener
+
+	log zerolog.Logger
 }
 
-func newConnectionContainer(cacheLog *zerolog.Logger, driverManager plc4go.PlcDriverManager, connectionString string) *connectionContainer {
+func newConnectionContainer(log zerolog.Logger, driverManager plc4go.PlcDriverManager, connectionString string) *connectionContainer {
 	return &connectionContainer{
-		cacheLog:         cacheLog,
 		driverManager:    driverManager,
 		connectionString: connectionString,
 		lock:             lock.NewCASMutex(),
@@ -55,13 +55,15 @@ func newConnectionContainer(cacheLog *zerolog.Logger, driverManager plc4go.PlcDr
 		closed:           false,
 		state:            StateInitialized,
 		queue:            []chan plc4go.PlcConnectionConnectResult{},
+
+		log: log,
 	}
 }
 
-func (t *connectionContainer) connect() {
-	t.cacheLog.Debug().Str("connectionString", t.connectionString).Msg("Connecting new cached connection ...")
+func (c *connectionContainer) connect() {
+	c.log.Debug().Str("connectionString", c.connectionString).Msg("Connecting new cached connection ...")
 	// Initialize the new connection.
-	connectionResultChan := t.driverManager.GetConnection(t.connectionString)
+	connectionResultChan := c.driverManager.GetConnection(c.connectionString)
 
 	// Allow us to finish this function and return the lock quickly
 	// Wait for the connection to be established.
@@ -69,85 +71,85 @@ func (t *connectionContainer) connect() {
 	connectionResult := <-connectionResultChan
 
 	// Get the lock.
-	t.lock.Lock()
-	defer t.lock.Unlock()
+	c.lock.Lock()
+	defer c.lock.Unlock()
 
 	// If the connection was successful, pass the active connection into the container.
 	// If something went wrong, we have to remove the connection from the cache and return the error.
 	if err := connectionResult.GetErr(); err != nil {
-		t.cacheLog.Debug().Str("connectionString", t.connectionString).
+		c.log.Debug().Str("connectionString", c.connectionString).
 			Err(err).
 			Msg("Error connecting new cached connection.")
 		// Tell the connection cache that the connection is no longer available.
-		if t.listeners != nil {
+		if c.listeners != nil {
 			event := connectionErrorEvent{
-				conn: *t,
+				conn: *c,
 				err:  err,
 			}
-			for _, listener := range t.listeners {
+			for _, listener := range c.listeners {
 				listener.onConnectionEvent(event)
 			}
 		}
 
 		// Send a failure to all waiting clients.
-		if len(t.queue) > 0 {
-			for _, waitingClient := range t.queue {
+		if len(c.queue) > 0 {
+			for _, waitingClient := range c.queue {
 				waitingClient <- _default.NewDefaultPlcConnectionConnectResult(nil, err)
 			}
-			t.queue = nil
+			c.queue = nil
 		}
 		return
 	}
 
-	t.cacheLog.Debug().Str("connectionString", t.connectionString).Msg("Successfully connected new cached connection.")
+	c.log.Debug().Str("connectionString", c.connectionString).Msg("Successfully connected new cached connection.")
 	// Inject the real connection into the container.
 	if connection, ok := connectionResult.GetConnection().(tracedPlcConnection); !ok {
-		panic("Return connection doesn't implement the cache.tracedPlcConnection interface")
+		panic("Return connection doesn'c implement the cache.tracedPlcConnection interface")
 	} else {
-		t.connection = connection
+		c.connection = connection
 	}
-	t.tracerEnabled = t.connection.IsTraceEnabled()
+	c.tracerEnabled = c.connection.IsTraceEnabled()
 	// Mark the connection as idle for now.
-	t.state = StateIdle
+	c.state = StateIdle
 	// If there is a request in the queue, hand out the connection to that.
-	if len(t.queue) > 0 {
+	if len(c.queue) > 0 {
 		// Get the first in the queue.
-		queueHead := t.queue[0]
-		t.queue = t.queue[1:]
+		queueHead := c.queue[0]
+		c.queue = c.queue[1:]
 		// Mark the connection as being used.
-		t.state = StateInUse
+		c.state = StateInUse
 		// Return the lease to the caller.
-		connection := newPlcConnectionLease(t, t.leaseCounter, t.connection)
-		// In this case we don't need to check for blocks
+		connection := newPlcConnectionLease(c, c.leaseCounter, c.connection)
+		// In this case we don'c need to check for blocks
 		// as the getConnection function of the connection cache
 		// is definitely eagerly waiting for input.
 		queueHead <- _default.NewDefaultPlcConnectionConnectResult(connection, nil)
 	}
 }
 
-func (t *connectionContainer) addListener(listener connectionListener) {
+func (c *connectionContainer) addListener(listener connectionListener) {
 	// Get the lock.
-	t.lock.Lock()
-	defer t.lock.Unlock()
+	c.lock.Lock()
+	defer c.lock.Unlock()
 	// Add the listener to the queue
-	t.listeners = append(t.listeners, listener)
+	c.listeners = append(c.listeners, listener)
 }
 
-func (t *connectionContainer) lease() <-chan plc4go.PlcConnectionConnectResult {
-	t.lock.Lock()
-	defer t.lock.Unlock()
+func (c *connectionContainer) lease() <-chan plc4go.PlcConnectionConnectResult {
+	c.lock.Lock()
+	defer c.lock.Unlock()
 
 	ch := make(chan plc4go.PlcConnectionConnectResult)
 	// Check if the connection is available.
-	switch t.state {
+	switch c.state {
 	case StateIdle:
-		t.leaseCounter++
-		connection := newPlcConnectionLease(t, t.leaseCounter, t.connection)
-		t.state = StateInUse
-		// In this case we don't need to check for blocks
+		c.leaseCounter++
+		connection := newPlcConnectionLease(c, c.leaseCounter, c.connection)
+		c.state = StateInUse
+		// In this case we don'c need to check for blocks
 		// as the getConnection function of the connection cache
 		// is definitely eagerly waiting for input.
-		t.cacheLog.Debug().Str("connectionString", t.connectionString).
+		c.log.Debug().Str("connectionString", c.connectionString).
 			Msg("Got lease instantly as connection was idle.")
 		go func() {
 			ch <- _default.NewDefaultPlcConnectionConnectResult(connection, nil)
@@ -155,17 +157,17 @@ func (t *connectionContainer) lease() <-chan plc4go.PlcConnectionConnectResult {
 	case StateInUse, StateInitialized:
 		// If the connection is currently busy or not finished initializing,
 		// add the new channel to the queue for this connection.
-		t.queue = append(t.queue, ch)
-		t.cacheLog.Debug().Str("connectionString", t.connectionString).
-			Int("waiting-queue-size", len(t.queue)).
+		c.queue = append(c.queue, ch)
+		c.log.Debug().Str("connectionString", c.connectionString).
+			Int("waiting-queue-size", len(c.queue)).
 			Msg("Added lease-request to queue.")
 	case StateInvalid:
-		t.cacheLog.Debug().Str("connectionString", t.connectionString).Msg("No lease because invalid")
+		c.log.Debug().Str("connectionString", c.connectionString).Msg("No lease because invalid")
 	}
 	return ch
 }
 
-func (t *connectionContainer) returnConnection(newState cachedPlcConnectionState) error {
+func (c *connectionContainer) returnConnection(newState cachedPlcConnectionState) error {
 	// Intentionally not locking anything, as there are two cases, where the connection is returned:
 	// 1) The connection failed to get established (No connection has a lock anyway)
 	// 2) The connection is returned, then the one returning it already has a lock on it.
@@ -173,47 +175,47 @@ func (t *connectionContainer) returnConnection(newState cachedPlcConnectionState
 	switch newState {
 	case StateInitialized, StateInvalid:
 		// TODO: Perhaps do a maximum number of retries and then call failConnection()
-		t.cacheLog.Debug().Str("connectionString", t.connectionString).
+		c.log.Debug().Str("connectionString", c.connectionString).
 			Msgf("Client returned a %s connection, reconnecting.", newState)
-		t.connect()
+		c.connect()
 	default:
-		t.cacheLog.Debug().Str("connectionString", t.connectionString).Msg("Client returned valid connection.")
+		c.log.Debug().Str("connectionString", c.connectionString).Msg("Client returned valid connection.")
 	}
-	t.lock.Lock()
-	defer t.lock.Unlock()
-	if t.connection == nil {
-		t.state = StateInvalid
-		return errors.New("Can't return a broken connection")
+	c.lock.Lock()
+	defer c.lock.Unlock()
+	if c.connection == nil {
+		c.state = StateInvalid
+		return errors.New("Can'c return a broken connection")
 	}
 
 	// Check how many others are waiting for this connection.
-	if len(t.queue) > 0 {
+	if len(c.queue) > 0 {
 		// There are waiting clients, give the connection to the next client in the line.
-		next := t.queue[0]
-		t.queue = t.queue[1:]
-		t.leaseCounter++
-		connection := newPlcConnectionLease(t, t.leaseCounter, t.connection)
+		next := c.queue[0]
+		c.queue = c.queue[1:]
+		c.leaseCounter++
+		connection := newPlcConnectionLease(c, c.leaseCounter, c.connection)
 		// Send asynchronously as the receiver might have given up waiting,
-		// and we don't want anything to block here. 1ms should be enough for
+		// and we don'c want anything to block here. 1ms should be enough for
 		// the calling process to reach the blocking read.
 		go func() {
-			// In this case we don't need to check for blocks
+			// In this case we don'c need to check for blocks
 			// as the getConnection function of the connection cache
 			// is definitely eagerly waiting for input.
 			next <- _default.NewDefaultPlcConnectionConnectResult(connection, nil)
-			t.cacheLog.Debug().Str("connectionString", t.connectionString).
-				Int("waiting-queue-size", len(t.queue)).
+			c.log.Debug().Str("connectionString", c.connectionString).
+				Int("waiting-queue-size", len(c.queue)).
 				Msg("Returned connection to the next client waiting.")
 		}()
 	} else {
 		// Otherwise, just mark the connection as idle.
-		t.cacheLog.Debug().Str("connectionString", t.connectionString).
+		c.log.Debug().Str("connectionString", c.connectionString).
 			Msg("Connection set to 'idle'.")
-		t.state = StateIdle
+		c.state = StateIdle
 	}
 	return nil
 }
 
-func (t *connectionContainer) String() string {
-	return fmt.Sprintf("connectionContainer{%s:%s, leaseCounter: %d, closed: %t, state: %s}", t.connectionString, t.connection, t.leaseCounter, t.closed, t.state)
+func (c *connectionContainer) String() string {
+	return fmt.Sprintf("connectionContainer{%s:%s, leaseCounter: %d, closed: %t, state: %s}", c.connectionString, c.connection, c.leaseCounter, c.closed, c.state)
 }
diff --git a/plc4go/pkg/api/cache/connectionContainer_test.go b/plc4go/pkg/api/cache/connectionContainer_test.go
index 1cb1246b0b..44bb7f2295 100644
--- a/plc4go/pkg/api/cache/connectionContainer_test.go
+++ b/plc4go/pkg/api/cache/connectionContainer_test.go
@@ -23,8 +23,10 @@ import (
 	"fmt"
 	"github.com/apache/plc4x/plc4go/internal/simulated"
 	plc4go "github.com/apache/plc4x/plc4go/pkg/api"
+	"github.com/apache/plc4x/plc4go/pkg/api/config"
+	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/testutils"
 	"github.com/rs/zerolog"
-	"github.com/rs/zerolog/log"
 	"github.com/stretchr/testify/assert"
 	"github.com/viney-shih/go-lock"
 	"testing"
@@ -32,7 +34,7 @@ import (
 
 func Test_connectionContainer_String(t1 *testing.T) {
 	type fields struct {
-		cacheLog         *zerolog.Logger
+		log              zerolog.Logger
 		lock             lock.RWMutex
 		connectionString string
 		driverManager    plc4go.PlcDriverManager
@@ -47,14 +49,24 @@ func Test_connectionContainer_String(t1 *testing.T) {
 	tests := []struct {
 		name   string
 		fields fields
+		setup  func(t *testing.T, fields *fields)
 		want   string
 	}{
-		// TODO: Add test cases.
+		{
+			name: "string it",
+			want: "connectionContainer{:%!s(<nil>), leaseCounter: 0, closed: false, state: StateInitialized}",
+			setup: func(t *testing.T, fields *fields) {
+				fields.log = testutils.ProduceTestingLogger(t)
+			},
+		},
 	}
 	for _, tt := range tests {
-		t1.Run(tt.name, func(t1 *testing.T) {
-			t := &connectionContainer{
-				cacheLog:         tt.fields.cacheLog,
+		t1.Run(tt.name, func(t *testing.T) {
+			if tt.setup != nil {
+				tt.setup(t, &tt.fields)
+			}
+			c := &connectionContainer{
+				log:              tt.fields.log,
 				lock:             tt.fields.lock,
 				connectionString: tt.fields.connectionString,
 				driverManager:    tt.fields.driverManager,
@@ -66,14 +78,14 @@ func Test_connectionContainer_String(t1 *testing.T) {
 				queue:            tt.fields.queue,
 				listeners:        tt.fields.listeners,
 			}
-			assert.Equalf(t1, tt.want, t.String(), "String()")
+			assert.Equalf(t1, tt.want, c.String(), "String()")
 		})
 	}
 }
 
 func Test_connectionContainer_addListener(t1 *testing.T) {
 	type fields struct {
-		cacheLog         *zerolog.Logger
+		log              zerolog.Logger
 		lock             lock.RWMutex
 		connectionString string
 		driverManager    plc4go.PlcDriverManager
@@ -98,7 +110,7 @@ func Test_connectionContainer_addListener(t1 *testing.T) {
 	for _, tt := range tests {
 		t1.Run(tt.name, func(t1 *testing.T) {
 			t := &connectionContainer{
-				cacheLog:         tt.fields.cacheLog,
+				log:              tt.fields.log,
 				lock:             tt.fields.lock,
 				connectionString: tt.fields.connectionString,
 				driverManager:    tt.fields.driverManager,
@@ -117,7 +129,7 @@ func Test_connectionContainer_addListener(t1 *testing.T) {
 
 func Test_connectionContainer_connect(t1 *testing.T) {
 	type fields struct {
-		cacheLog         *zerolog.Logger
+		log              zerolog.Logger
 		lock             lock.RWMutex
 		connectionString string
 		driverManager    plc4go.PlcDriverManager
@@ -132,26 +144,33 @@ func Test_connectionContainer_connect(t1 *testing.T) {
 	tests := []struct {
 		name   string
 		fields fields
+		setup  func(t *testing.T, fields *fields)
 	}{
 		{
 			name: "connect fresh",
 			fields: fields{
-				cacheLog: &log.Logger,
-				driverManager: func() plc4go.PlcDriverManager {
-					driverManager := plc4go.NewPlcDriverManager()
-					driverManager.RegisterDriver(simulated.NewDriver())
-					return driverManager
-				}(),
 				connectionString: "simulated://1.2.3.4:42",
 				lock:             lock.NewCASMutex(),
 				queue:            []chan plc4go.PlcConnectionConnectResult{},
 			},
+			setup: func(t *testing.T, fields *fields) {
+				logger := testutils.ProduceTestingLogger(t)
+
+				fields.log = logger
+
+				driverManager := plc4go.NewPlcDriverManager(config.WithCustomLogger(logger))
+				driverManager.RegisterDriver(simulated.NewDriver(options.WithCustomLogger(logger)))
+				fields.driverManager = driverManager
+			},
 		},
 	}
 	for _, tt := range tests {
-		t1.Run(tt.name, func(t1 *testing.T) {
-			t := &connectionContainer{
-				cacheLog:         tt.fields.cacheLog,
+		t1.Run(tt.name, func(t *testing.T) {
+			if tt.setup != nil {
+				tt.setup(t, &tt.fields)
+			}
+			c := &connectionContainer{
+				log:              tt.fields.log,
 				lock:             tt.fields.lock,
 				connectionString: tt.fields.connectionString,
 				driverManager:    tt.fields.driverManager,
@@ -163,14 +182,14 @@ func Test_connectionContainer_connect(t1 *testing.T) {
 				queue:            tt.fields.queue,
 				listeners:        tt.fields.listeners,
 			}
-			t.connect()
+			c.connect()
 		})
 	}
 }
 
 func Test_connectionContainer_lease(t1 *testing.T) {
 	type fields struct {
-		cacheLog         *zerolog.Logger
+		log              zerolog.Logger
 		lock             lock.RWMutex
 		connectionString string
 		driverManager    plc4go.PlcDriverManager
@@ -185,12 +204,12 @@ func Test_connectionContainer_lease(t1 *testing.T) {
 	tests := []struct {
 		name       string
 		fields     fields
+		setup      func(t *testing.T, fields *fields)
 		wantNotNil bool
 	}{
 		{
 			name: "lease fresh",
 			fields: fields{
-				cacheLog: &log.Logger,
 				driverManager: func() plc4go.PlcDriverManager {
 					driverManager := plc4go.NewPlcDriverManager()
 					driverManager.RegisterDriver(simulated.NewDriver())
@@ -200,13 +219,25 @@ func Test_connectionContainer_lease(t1 *testing.T) {
 				lock:             lock.NewCASMutex(),
 				queue:            []chan plc4go.PlcConnectionConnectResult{},
 			},
+			setup: func(t *testing.T, fields *fields) {
+				logger := testutils.ProduceTestingLogger(t)
+
+				fields.log = logger
+
+				driverManager := plc4go.NewPlcDriverManager(config.WithCustomLogger(logger))
+				driverManager.RegisterDriver(simulated.NewDriver(options.WithCustomLogger(logger)))
+				fields.driverManager = driverManager
+			},
 			wantNotNil: true,
 		},
 	}
 	for _, tt := range tests {
-		t1.Run(tt.name, func(t1 *testing.T) {
-			t := &connectionContainer{
-				cacheLog:         tt.fields.cacheLog,
+		t1.Run(tt.name, func(t *testing.T) {
+			if tt.setup != nil {
+				tt.setup(t, &tt.fields)
+			}
+			c := &connectionContainer{
+				log:              tt.fields.log,
 				lock:             tt.fields.lock,
 				connectionString: tt.fields.connectionString,
 				driverManager:    tt.fields.driverManager,
@@ -218,14 +249,14 @@ func Test_connectionContainer_lease(t1 *testing.T) {
 				queue:            tt.fields.queue,
 				listeners:        tt.fields.listeners,
 			}
-			assert.True(t1, tt.wantNotNil, t.lease(), "lease()")
+			assert.True(t1, tt.wantNotNil, c.lease(), "lease()")
 		})
 	}
 }
 
 func Test_connectionContainer_returnConnection(t1 *testing.T) {
 	type fields struct {
-		cacheLog         *zerolog.Logger
+		log              zerolog.Logger
 		lock             lock.RWMutex
 		connectionString string
 		driverManager    plc4go.PlcDriverManager
@@ -244,17 +275,12 @@ func Test_connectionContainer_returnConnection(t1 *testing.T) {
 		name    string
 		fields  fields
 		args    args
+		setup   func(t *testing.T, fields *fields, args *args)
 		wantErr assert.ErrorAssertionFunc
 	}{
 		{
 			name: "return connection fresh",
 			fields: fields{
-				cacheLog: &log.Logger,
-				driverManager: func() plc4go.PlcDriverManager {
-					driverManager := plc4go.NewPlcDriverManager()
-					driverManager.RegisterDriver(simulated.NewDriver())
-					return driverManager
-				}(),
 				connectionString: "simulated://1.2.3.4:42",
 				lock:             lock.NewCASMutex(),
 				queue:            []chan plc4go.PlcConnectionConnectResult{},
@@ -262,17 +288,20 @@ func Test_connectionContainer_returnConnection(t1 *testing.T) {
 			args: args{
 				state: StateInitialized,
 			},
+			setup: func(t *testing.T, fields *fields, args *args) {
+				logger := testutils.ProduceTestingLogger(t)
+
+				fields.log = logger
+
+				driverManager := plc4go.NewPlcDriverManager(config.WithCustomLogger(logger))
+				driverManager.RegisterDriver(simulated.NewDriver(options.WithCustomLogger(logger)))
+				fields.driverManager = driverManager
+			},
 			wantErr: assert.NoError,
 		},
 		{
 			name: "return unconnected connection",
 			fields: fields{
-				cacheLog: &log.Logger,
-				driverManager: func() plc4go.PlcDriverManager {
-					driverManager := plc4go.NewPlcDriverManager()
-					driverManager.RegisterDriver(simulated.NewDriver())
-					return driverManager
-				}(),
 				connectionString: "simulated://1.2.3.4:42",
 				lock:             lock.NewCASMutex(),
 				queue:            []chan plc4go.PlcConnectionConnectResult{},
@@ -280,13 +309,25 @@ func Test_connectionContainer_returnConnection(t1 *testing.T) {
 			args: args{
 				state: StateInUse,
 			},
+			setup: func(t *testing.T, fields *fields, args *args) {
+				logger := testutils.ProduceTestingLogger(t)
+
+				fields.log = logger
+
+				driverManager := plc4go.NewPlcDriverManager(config.WithCustomLogger(logger))
+				driverManager.RegisterDriver(simulated.NewDriver(options.WithCustomLogger(logger)))
+				fields.driverManager = driverManager
+			},
 			wantErr: assert.Error,
 		},
 	}
 	for _, tt := range tests {
-		t1.Run(tt.name, func(t1 *testing.T) {
-			t := &connectionContainer{
-				cacheLog:         tt.fields.cacheLog,
+		t1.Run(tt.name, func(t *testing.T) {
+			if tt.setup != nil {
+				tt.setup(t, &tt.fields, &tt.args)
+			}
+			c := &connectionContainer{
+				log:              tt.fields.log,
 				lock:             tt.fields.lock,
 				connectionString: tt.fields.connectionString,
 				driverManager:    tt.fields.driverManager,
@@ -298,7 +339,7 @@ func Test_connectionContainer_returnConnection(t1 *testing.T) {
 				queue:            tt.fields.queue,
 				listeners:        tt.fields.listeners,
 			}
-			tt.wantErr(t1, t.returnConnection(tt.args.state), fmt.Sprintf("returnConnection(%v)", tt.args.state))
+			tt.wantErr(t1, c.returnConnection(tt.args.state), fmt.Sprintf("returnConnection(%v)", tt.args.state))
 		})
 	}
 }
diff --git a/plc4go/pkg/api/cache/mock_tracedPlcConnection_test.go b/plc4go/pkg/api/cache/mock_tracedPlcConnection_test.go
index 2efa3c7de8..39011fc323 100644
--- a/plc4go/pkg/api/cache/mock_tracedPlcConnection_test.go
+++ b/plc4go/pkg/api/cache/mock_tracedPlcConnection_test.go
@@ -23,13 +23,12 @@ package cache
 
 import (
 	context "context"
+	spi "github.com/apache/plc4x/plc4go/spi/tracer"
 
 	model "github.com/apache/plc4x/plc4go/pkg/api/model"
 	mock "github.com/stretchr/testify/mock"
 
 	plc4go "github.com/apache/plc4x/plc4go/pkg/api"
-
-	spi "github.com/apache/plc4x/plc4go/spi"
 )
 
 // mockTracedPlcConnection is an autogenerated mock type for the tracedPlcConnection type
diff --git a/plc4go/pkg/api/cache/tracedPlcConnection.go b/plc4go/pkg/api/cache/noGlobalLog_test.go
similarity index 78%
copy from plc4go/pkg/api/cache/tracedPlcConnection.go
copy to plc4go/pkg/api/cache/noGlobalLog_test.go
index 104e466721..9d0fe095b8 100644
--- a/plc4go/pkg/api/cache/tracedPlcConnection.go
+++ b/plc4go/pkg/api/cache/noGlobalLog_test.go
@@ -19,15 +19,9 @@
 
 package cache
 
-import (
-	"github.com/apache/plc4x/plc4go/pkg/api"
-	"github.com/apache/plc4x/plc4go/spi"
-)
+import "github.com/apache/plc4x/plc4go/spi/testutils"
 
-type tracedPlcConnection interface {
-	plc4go.PlcConnection
-
-	GetConnectionId() string
-	IsTraceEnabled() bool
-	GetTracer() *spi.Tracer
+// This ensures that we don't global log
+func init() {
+	testutils.ExplodingGlobalLogger(true)
 }
diff --git a/plc4go/pkg/api/cache/plcConnectionLease.go b/plc4go/pkg/api/cache/plcConnectionLease.go
index 8ba3a71fda..41f6b0a69a 100644
--- a/plc4go/pkg/api/cache/plcConnectionLease.go
+++ b/plc4go/pkg/api/cache/plcConnectionLease.go
@@ -22,11 +22,11 @@ package cache
 import (
 	"context"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"time"
 
 	plc4go "github.com/apache/plc4x/plc4go/pkg/api"
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-	"github.com/apache/plc4x/plc4go/spi"
 	_default "github.com/apache/plc4x/plc4go/spi/default"
 )
 
@@ -58,7 +58,7 @@ func (t *plcConnectionLease) IsTraceEnabled() bool {
 	return t.connection.IsTraceEnabled()
 }
 
-func (t *plcConnectionLease) GetTracer() *spi.Tracer {
+func (t *plcConnectionLease) GetTracer() *tracer.Tracer {
 	if t.connection == nil {
 		panic("Called 'GetTracer' on a closed cached connection")
 	}
@@ -119,7 +119,7 @@ func (t *plcConnectionLease) Close() <-chan plc4go.PlcConnectionCloseResult {
 		}
 
 		// Extract the trace entries from the connection.
-		var traces []spi.TraceEntry
+		var traces []tracer.TraceEntry
 		if t.IsTraceEnabled() {
 			tracer := t.GetTracer()
 			// Save all traces.
diff --git a/plc4go/pkg/api/cache/tracedPlcConnection.go b/plc4go/pkg/api/cache/tracedPlcConnection.go
index 104e466721..7b10061169 100644
--- a/plc4go/pkg/api/cache/tracedPlcConnection.go
+++ b/plc4go/pkg/api/cache/tracedPlcConnection.go
@@ -21,7 +21,7 @@ package cache
 
 import (
 	"github.com/apache/plc4x/plc4go/pkg/api"
-	"github.com/apache/plc4x/plc4go/spi"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 )
 
 type tracedPlcConnection interface {
@@ -29,5 +29,5 @@ type tracedPlcConnection interface {
 
 	GetConnectionId() string
 	IsTraceEnabled() bool
-	GetTracer() *spi.Tracer
+	GetTracer() *tracer.Tracer
 }
diff --git a/plc4go/spi/default/DefaultConnection.go b/plc4go/spi/default/DefaultConnection.go
index 17f8715daa..ebbde588cc 100644
--- a/plc4go/spi/default/DefaultConnection.go
+++ b/plc4go/spi/default/DefaultConnection.go
@@ -21,6 +21,7 @@ package _default
 
 import (
 	"context"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/rs/zerolog"
 	"time"
 
@@ -92,7 +93,7 @@ func NewDefaultPlcConnectionConnectResult(connection plc4go.PlcConnection, err e
 
 type DefaultPlcConnectionCloseResult interface {
 	plc4go.PlcConnectionCloseResult
-	GetTraces() []spi.TraceEntry
+	GetTraces() []tracer.TraceEntry
 }
 
 func NewDefaultPlcConnectionCloseResult(connection plc4go.PlcConnection, err error) plc4go.PlcConnectionCloseResult {
@@ -103,7 +104,7 @@ func NewDefaultPlcConnectionCloseResult(connection plc4go.PlcConnection, err err
 	}
 }
 
-func NewDefaultPlcConnectionCloseResultWithTraces(connection plc4go.PlcConnection, err error, traces []spi.TraceEntry) plc4go.PlcConnectionCloseResult {
+func NewDefaultPlcConnectionCloseResultWithTraces(connection plc4go.PlcConnection, err error, traces []tracer.TraceEntry) plc4go.PlcConnectionCloseResult {
 	return &plcConnectionCloseResult{
 		connection: connection,
 		err:        err,
@@ -198,7 +199,7 @@ func (d *plcConnectionConnectResult) GetErr() error {
 type plcConnectionCloseResult struct {
 	connection plc4go.PlcConnection
 	err        error
-	traces     []spi.TraceEntry
+	traces     []tracer.TraceEntry
 }
 
 func (d *plcConnectionCloseResult) GetConnection() plc4go.PlcConnection {
@@ -209,7 +210,7 @@ func (d *plcConnectionCloseResult) GetErr() error {
 	return d.err
 }
 
-func (d *plcConnectionCloseResult) GetTraces() []spi.TraceEntry {
+func (d *plcConnectionCloseResult) GetTraces() []tracer.TraceEntry {
 	return d.traces
 }
 
diff --git a/plc4go/spi/default/DefaultConnection_test.go b/plc4go/spi/default/DefaultConnection_test.go
index 4965e5eda6..c013b0690e 100644
--- a/plc4go/spi/default/DefaultConnection_test.go
+++ b/plc4go/spi/default/DefaultConnection_test.go
@@ -22,6 +22,7 @@ package _default
 import (
 	"context"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"testing"
 	"time"
 
@@ -241,7 +242,7 @@ func TestNewDefaultPlcConnectionCloseResultWithTraces(t *testing.T) {
 	type args struct {
 		connection plc4go.PlcConnection
 		err        error
-		traces     []spi.TraceEntry
+		traces     []tracer.TraceEntry
 	}
 	tests := []struct {
 		name string
@@ -1152,7 +1153,7 @@ func Test_plcConnectionCloseResult_GetConnection(t *testing.T) {
 	type fields struct {
 		connection plc4go.PlcConnection
 		err        error
-		traces     []spi.TraceEntry
+		traces     []tracer.TraceEntry
 	}
 	tests := []struct {
 		name   string
@@ -1179,7 +1180,7 @@ func Test_plcConnectionCloseResult_GetErr(t *testing.T) {
 	type fields struct {
 		connection plc4go.PlcConnection
 		err        error
-		traces     []spi.TraceEntry
+		traces     []tracer.TraceEntry
 	}
 	tests := []struct {
 		name      string
@@ -1214,12 +1215,12 @@ func Test_plcConnectionCloseResult_GetTraces(t *testing.T) {
 	type fields struct {
 		connection plc4go.PlcConnection
 		err        error
-		traces     []spi.TraceEntry
+		traces     []tracer.TraceEntry
 	}
 	tests := []struct {
 		name   string
 		fields fields
-		want   []spi.TraceEntry
+		want   []tracer.TraceEntry
 	}{
 		{
 			name: "get it",
diff --git a/plc4go/spi/default/mock_DefaultPlcConnectionCloseResult_test.go b/plc4go/spi/default/mock_DefaultPlcConnectionCloseResult_test.go
index 4d39f0dc21..5ae4cd4380 100644
--- a/plc4go/spi/default/mock_DefaultPlcConnectionCloseResult_test.go
+++ b/plc4go/spi/default/mock_DefaultPlcConnectionCloseResult_test.go
@@ -23,9 +23,8 @@ package _default
 
 import (
 	plc4go "github.com/apache/plc4x/plc4go/pkg/api"
+	spi "github.com/apache/plc4x/plc4go/spi/tracer"
 	mock "github.com/stretchr/testify/mock"
-
-	spi "github.com/apache/plc4x/plc4go/spi"
 )
 
 // MockDefaultPlcConnectionCloseResult is an autogenerated mock type for the DefaultPlcConnectionCloseResult type
diff --git a/plc4go/spi/Tracer.go b/plc4go/spi/tracer/Tracer.go
similarity index 88%
rename from plc4go/spi/Tracer.go
rename to plc4go/spi/tracer/Tracer.go
index f1ea2f696b..9a78bc7360 100644
--- a/plc4go/spi/Tracer.go
+++ b/plc4go/spi/tracer/Tracer.go
@@ -17,11 +17,16 @@
  * under the License.
  */
 
-package spi
+package tracer
 
 import (
-	"github.com/apache/plc4x/plc4go/spi/utils"
+	"fmt"
 	"time"
+
+	"github.com/apache/plc4x/plc4go/spi/options"
+	"github.com/apache/plc4x/plc4go/spi/utils"
+
+	"github.com/rs/zerolog"
 )
 
 type TraceEntry struct {
@@ -40,12 +45,15 @@ type TracerProvider interface {
 type Tracer struct {
 	connectionId string
 	traceEntries []TraceEntry
+
+	log zerolog.Logger
 }
 
-func NewTracer(connectionId string) *Tracer {
+func NewTracer(connectionId string, _options ...options.WithOption) *Tracer {
 	return &Tracer{
 		connectionId: connectionId,
 		traceEntries: []TraceEntry{},
+		log:          options.ExtractCustomLogger(_options...),
 	}
 }
 
@@ -76,7 +84,7 @@ func (t *Tracer) AddTrace(operation string, message string) {
 }
 
 func (t *Tracer) AddTransactionalStartTrace(operation string, message string) string {
-	transactionId := utils.GenerateId(4)
+	transactionId := utils.GenerateId(t.log, 4)
 	t.traceEntries = append(t.traceEntries, TraceEntry{
 		Timestamp:     time.Now(),
 		ConnectionId:  t.connectionId,
@@ -117,3 +125,7 @@ traceFiltering:
 	}
 	return result
 }
+
+func (t *Tracer) String() string {
+	return fmt.Sprintf("Tracer for %s", t.connectionId)
+}
diff --git a/plc4go/spi/Tracer_test.go b/plc4go/spi/tracer/Tracer_test.go
similarity index 99%
rename from plc4go/spi/Tracer_test.go
rename to plc4go/spi/tracer/Tracer_test.go
index ae2d10f265..1c4008185b 100644
--- a/plc4go/spi/Tracer_test.go
+++ b/plc4go/spi/tracer/Tracer_test.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package spi
+package tracer
 
 import (
 	"github.com/stretchr/testify/assert"
diff --git a/plc4go/spi/mock_TracerProvider_test.go b/plc4go/spi/tracer/mock_TracerProvider_test.go
similarity index 98%
rename from plc4go/spi/mock_TracerProvider_test.go
rename to plc4go/spi/tracer/mock_TracerProvider_test.go
index 1c98e5c1cd..1c5b011293 100644
--- a/plc4go/spi/mock_TracerProvider_test.go
+++ b/plc4go/spi/tracer/mock_TracerProvider_test.go
@@ -19,9 +19,11 @@
 
 // Code generated by mockery v2.28.1. DO NOT EDIT.
 
-package spi
+package tracer
 
-import mock "github.com/stretchr/testify/mock"
+import (
+	mock "github.com/stretchr/testify/mock"
+)
 
 // MockTracerProvider is an autogenerated mock type for the TracerProvider type
 type MockTracerProvider struct {
diff --git a/plc4go/spi/utils/IdGenerator.go b/plc4go/spi/utils/IdGenerator.go
index a27f4b0373..a44e2f97df 100644
--- a/plc4go/spi/utils/IdGenerator.go
+++ b/plc4go/spi/utils/IdGenerator.go
@@ -21,14 +21,13 @@ package utils
 
 import (
 	"encoding/hex"
+	"github.com/rs/zerolog"
 	"math/rand"
-
-	"github.com/rs/zerolog/log"
 )
 
 var randomByteFiller = rand.Read
 
-func GenerateId(numBytes int) string {
+func GenerateId(log zerolog.Logger, numBytes int) string {
 	transactionIdBytes := make([]byte, numBytes)
 	n, err := randomByteFiller(transactionIdBytes)
 	log.Trace().Err(err).Msgf("Read %d bytes", n)
diff --git a/plc4go/spi/utils/IdGenerator_test.go b/plc4go/spi/utils/IdGenerator_test.go
index 514d930dee..abf104417c 100644
--- a/plc4go/spi/utils/IdGenerator_test.go
+++ b/plc4go/spi/utils/IdGenerator_test.go
@@ -20,6 +20,7 @@
 package utils
 
 import (
+	"github.com/rs/zerolog"
 	"github.com/stretchr/testify/assert"
 	"testing"
 )
@@ -46,7 +47,7 @@ func TestGenerateId(t *testing.T) {
 			randomByteFiller = func(_ []byte) (n int, err error) {
 				return 0, nil
 			}
-			assert.Equalf(t, tt.want, GenerateId(tt.args.numBytes), "GenerateId(%v)", tt.args.numBytes)
+			assert.Equalf(t, tt.want, GenerateId(zerolog.New(zerolog.NewConsoleWriter(zerolog.ConsoleTestWriter(t))), tt.args.numBytes), "GenerateId(%v)", tt.args.numBytes)
 		})
 	}
 }


[plc4x] 01/02: feat(plc4go): add new WithCustomLogger option

Posted by sr...@apache.org.
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
+}