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/05/31 15:23:15 UTC

[plc4x] branch develop updated: feat(plc4go/spi): use more local loggers

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


The following commit(s) were added to refs/heads/develop by this push:
     new 7c14c99a10 feat(plc4go/spi): use more local loggers
7c14c99a10 is described below

commit 7c14c99a104e0ee82db390f2c02b7befa1f8c7c1
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed May 31 17:23:02 2023 +0200

    feat(plc4go/spi): use more local loggers
---
 plc4go/internal/cbus/Browser.go                    |   2 +-
 plc4go/internal/knxnetip/Browser.go                |   5 +-
 plc4go/internal/knxnetip/Connection.go             |   4 +-
 plc4go/internal/modbus/Connection.go               |   4 +-
 plc4go/spi/default/DefaultBrowser.go               |  14 +-
 .../interceptors/SingleItemRequestInterceptor.go   |  51 ++--
 plc4go/spi/testutils/TestUtils.go                  |  21 +-
 .../spi/transactions/RequestTransactionManager.go  |  12 +-
 plc4go/spi/transports/TransportInstance.go         |  90 -------
 ...ltBufferedTransportInstanceRequirements_test.go | 140 ----------
 .../mock_DefaultBufferedTransportInstance_test.go  | 300 ---------------------
 plc4go/spi/transports/pcap/Transport.go            |   5 +-
 plc4go/spi/transports/pcap/Transport_test.go       |  17 +-
 plc4go/spi/transports/serial/Transport.go          |   5 +-
 plc4go/spi/transports/serial/Transport_test.go     |  13 +-
 plc4go/spi/transports/tcp/Transport.go             |   5 +-
 plc4go/spi/transports/tcp/Transport_test.go        |  27 +-
 .../DefaultBufferedTransportInstance.go}           |  37 +--
 .../DefaultBufferedTransportInstance_test.go}      |   5 +-
 plc4go/spi/utils/Net.go                            |  38 +--
 20 files changed, 141 insertions(+), 654 deletions(-)

diff --git a/plc4go/internal/cbus/Browser.go b/plc4go/internal/cbus/Browser.go
index e0a83358c2..3ae33a08c7 100644
--- a/plc4go/internal/cbus/Browser.go
+++ b/plc4go/internal/cbus/Browser.go
@@ -51,7 +51,7 @@ func NewBrowser(connection plc4go.PlcConnection, _options ...options.WithOption)
 
 		log: options.ExtractCustomLogger(_options...),
 	}
-	browser.DefaultBrowser = _default.NewDefaultBrowser(browser)
+	browser.DefaultBrowser = _default.NewDefaultBrowser(browser, _options...)
 	return &browser
 }
 
diff --git a/plc4go/internal/knxnetip/Browser.go b/plc4go/internal/knxnetip/Browser.go
index df081b2741..fffc0ecf73 100644
--- a/plc4go/internal/knxnetip/Browser.go
+++ b/plc4go/internal/knxnetip/Browser.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"encoding/hex"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/spi/options"
 	"strconv"
 	"strings"
 	"time"
@@ -46,13 +47,13 @@ type Browser struct {
 	sequenceCounter uint8
 }
 
-func NewBrowser(connection *Connection, messageCodec spi.MessageCodec) *Browser {
+func NewBrowser(connection *Connection, messageCodec spi.MessageCodec, _options ...options.WithOption) *Browser {
 	browser := Browser{
 		connection:      connection,
 		messageCodec:    messageCodec,
 		sequenceCounter: 0,
 	}
-	browser.DefaultBrowser = _default.NewDefaultBrowser(browser)
+	browser.DefaultBrowser = _default.NewDefaultBrowser(browser, _options...)
 	return &browser
 }
 
diff --git a/plc4go/internal/knxnetip/Connection.go b/plc4go/internal/knxnetip/Connection.go
index 632b484c85..c3e573db8c 100644
--- a/plc4go/internal/knxnetip/Connection.go
+++ b/plc4go/internal/knxnetip/Connection.go
@@ -24,6 +24,7 @@ import (
 	"context"
 	"encoding/hex"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/spi/options"
 	"strconv"
 	"strings"
 	"sync"
@@ -165,7 +166,7 @@ type InternalResult struct {
 	err             error
 }
 
-func NewConnection(transportInstance transports.TransportInstance, options map[string][]string, tagHandler spi.PlcTagHandler) *Connection {
+func NewConnection(transportInstance transports.TransportInstance, options map[string][]string, tagHandler spi.PlcTagHandler, _options ...options.WithOption) *Connection {
 	connection := &Connection{
 		options:      options,
 		tagHandler:   tagHandler,
@@ -175,6 +176,7 @@ func NewConnection(transportInstance transports.TransportInstance, options map[s
 			spiModel.NewDefaultPlcWriteRequest,
 			spiModel.NewDefaultPlcReadResponse,
 			spiModel.NewDefaultPlcWriteResponse,
+			_options...,
 		),
 		subscribers:             []*Subscriber{},
 		valueCache:              map[uint16][]byte{},
diff --git a/plc4go/internal/modbus/Connection.go b/plc4go/internal/modbus/Connection.go
index 97afeaa7d0..c2cb42731a 100644
--- a/plc4go/internal/modbus/Connection.go
+++ b/plc4go/internal/modbus/Connection.go
@@ -22,6 +22,7 @@ package modbus
 import (
 	"context"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/spi/options"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/pkg/api"
@@ -47,7 +48,7 @@ type Connection struct {
 	tracer       *spi.Tracer
 }
 
-func NewConnection(unitIdentifier uint8, messageCodec spi.MessageCodec, options map[string][]string, tagHandler spi.PlcTagHandler) *Connection {
+func NewConnection(unitIdentifier uint8, messageCodec spi.MessageCodec, options map[string][]string, tagHandler spi.PlcTagHandler, _options ...options.WithOption) *Connection {
 	connection := &Connection{
 		unitIdentifier: unitIdentifier,
 		messageCodec:   messageCodec,
@@ -57,6 +58,7 @@ func NewConnection(unitIdentifier uint8, messageCodec spi.MessageCodec, options
 			spiModel.NewDefaultPlcWriteRequest,
 			spiModel.NewDefaultPlcReadResponse,
 			spiModel.NewDefaultPlcWriteResponse,
+			_options...,
 		),
 	}
 	if traceEnabledOption, ok := options["traceEnabled"]; ok {
diff --git a/plc4go/spi/default/DefaultBrowser.go b/plc4go/spi/default/DefaultBrowser.go
index e1e08e8d81..34c7ae12b7 100644
--- a/plc4go/spi/default/DefaultBrowser.go
+++ b/plc4go/spi/default/DefaultBrowser.go
@@ -21,11 +21,11 @@ package _default
 
 import (
 	"context"
-	"github.com/rs/zerolog/log"
-
 	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/options"
+	"github.com/rs/zerolog"
 )
 
 // DefaultBrowserRequirements adds required methods to Browser that are needed when using DefaultBrowser
@@ -37,9 +37,11 @@ type DefaultBrowser interface {
 	spi.PlcBrowser
 }
 
-func NewDefaultBrowser(defaultBrowserRequirements DefaultBrowserRequirements) DefaultBrowser {
+func NewDefaultBrowser(defaultBrowserRequirements DefaultBrowserRequirements, _options ...options.WithOption) DefaultBrowser {
 	return &defaultBrowser{
-		defaultBrowserRequirements,
+		DefaultBrowserRequirements: defaultBrowserRequirements,
+
+		log: options.ExtractCustomLogger(_options...),
 	}
 }
 
@@ -51,6 +53,8 @@ func NewDefaultBrowser(defaultBrowserRequirements DefaultBrowserRequirements) De
 
 type defaultBrowser struct {
 	DefaultBrowserRequirements
+
+	log zerolog.Logger
 }
 
 //
@@ -70,7 +74,7 @@ func (m *defaultBrowser) BrowseWithInterceptor(ctx context.Context, browseReques
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				log.Error().Interface("err", err).Msg("caught panic")
+				m.log.Error().Interface("err", err).Msg("caught panic")
 			}
 		}()
 		responseCodes := map[string]apiModel.PlcResponseCode{}
diff --git a/plc4go/spi/interceptors/SingleItemRequestInterceptor.go b/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
index 46e9ae6167..458206291b 100644
--- a/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
+++ b/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
@@ -25,8 +25,9 @@ import (
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/pkg/api/values"
 	"github.com/apache/plc4x/plc4go/spi"
+	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/utils"
-	"github.com/rs/zerolog/log"
+	"github.com/rs/zerolog"
 )
 
 type ReaderExposer interface {
@@ -74,10 +75,18 @@ type SingleItemRequestInterceptor struct {
 	writeRequestFactory  writeRequestFactory
 	readResponseFactory  readResponseFactory
 	writeResponseFactory writeResponseFactory
+
+	log zerolog.Logger
 }
 
-func NewSingleItemRequestInterceptor(readRequestFactory readRequestFactory, writeRequestFactory writeRequestFactory, readResponseFactory readResponseFactory, writeResponseFactory writeResponseFactory) SingleItemRequestInterceptor {
-	return SingleItemRequestInterceptor{readRequestFactory, writeRequestFactory, readResponseFactory, writeResponseFactory}
+func NewSingleItemRequestInterceptor(readRequestFactory readRequestFactory, writeRequestFactory writeRequestFactory, readResponseFactory readResponseFactory, writeResponseFactory writeResponseFactory, _options ...options.WithOption) SingleItemRequestInterceptor {
+	return SingleItemRequestInterceptor{
+		readRequestFactory:   readRequestFactory,
+		writeRequestFactory:  writeRequestFactory,
+		readResponseFactory:  readResponseFactory,
+		writeResponseFactory: writeResponseFactory,
+		log:                  options.ExtractCustomLogger(_options...),
+	}
 }
 
 ///////////////////////////////////////
@@ -134,18 +143,18 @@ func (m SingleItemRequestInterceptor) InterceptReadRequest(ctx context.Context,
 	}
 	// If this request just has one tag, go the shortcut
 	if len(readRequest.GetTagNames()) == 1 {
-		log.Debug().Msg("We got only one request, no splitting required")
+		m.log.Debug().Msg("We got only one request, no splitting required")
 		return []apiModel.PlcReadRequest{readRequest}
 	}
-	log.Trace().Msg("Splitting requests")
+	m.log.Trace().Msg("Splitting requests")
 	// In all other cases, create a new read request containing only one item
 	var readRequests []apiModel.PlcReadRequest
 	for _, tagName := range readRequest.GetTagNames() {
 		if err := ctx.Err(); err != nil {
-			log.Warn().Err(err).Msg("aborting early")
+			m.log.Warn().Err(err).Msg("aborting early")
 			return nil
 		}
-		log.Debug().Str("tagName", tagName).Msg("Splitting into own request")
+		m.log.Debug().Str("tagName", tagName).Msg("Splitting into own request")
 		tag := readRequest.GetTag(tagName)
 		subReadRequest := m.readRequestFactory(
 			map[string]apiModel.PlcTag{tagName: tag},
@@ -160,16 +169,16 @@ func (m SingleItemRequestInterceptor) InterceptReadRequest(ctx context.Context,
 
 func (m SingleItemRequestInterceptor) ProcessReadResponses(ctx context.Context, readRequest apiModel.PlcReadRequest, readResults []apiModel.PlcReadRequestResult) apiModel.PlcReadRequestResult {
 	if len(readResults) == 1 {
-		log.Debug().Msg("We got only one response, no merging required")
+		m.log.Debug().Msg("We got only one response, no merging required")
 		return readResults[0]
 	}
-	log.Trace().Msg("Merging requests")
+	m.log.Trace().Msg("Merging requests")
 	responseCodes := map[string]apiModel.PlcResponseCode{}
 	val := map[string]values.PlcValue{}
 	var err error = nil
 	for _, readResult := range readResults {
 		if ctxErr := ctx.Err(); ctxErr != nil {
-			log.Warn().Err(ctxErr).Msg("aborting early")
+			m.log.Warn().Err(ctxErr).Msg("aborting early")
 			if err != nil {
 				multiError := err.(utils.MultiError)
 				multiError.Errors = append(multiError.Errors, ctxErr)
@@ -179,7 +188,7 @@ func (m SingleItemRequestInterceptor) ProcessReadResponses(ctx context.Context,
 			break
 		}
 		if readResult.GetErr() != nil {
-			log.Debug().Err(readResult.GetErr()).Msgf("Error during read")
+			m.log.Debug().Err(readResult.GetErr()).Msgf("Error during read")
 			if err == nil {
 				// Lazy initialization of multi error
 				err = utils.MultiError{MainError: errors.New("while aggregating results"), Errors: []error{readResult.GetErr()}}
@@ -190,7 +199,7 @@ func (m SingleItemRequestInterceptor) ProcessReadResponses(ctx context.Context,
 		} else if response := readResult.GetResponse(); response != nil {
 			request := response.GetRequest()
 			if len(request.GetTagNames()) > 1 {
-				log.Error().Int("numberOfTags", len(request.GetTagNames())).Msg("We should only get 1")
+				m.log.Error().Int("numberOfTags", len(request.GetTagNames())).Msg("We should only get 1")
 			}
 			for _, tagName := range request.GetTagNames() {
 				responseCodes[tagName] = response.GetResponseCode(tagName)
@@ -211,18 +220,18 @@ func (m SingleItemRequestInterceptor) InterceptWriteRequest(ctx context.Context,
 	}
 	// If this request just has one tag, go the shortcut
 	if len(writeRequest.GetTagNames()) == 1 {
-		log.Debug().Msg("We got only one request, no splitting required")
+		m.log.Debug().Msg("We got only one request, no splitting required")
 		return []apiModel.PlcWriteRequest{writeRequest}
 	}
-	log.Trace().Msg("Splitting requests")
+	m.log.Trace().Msg("Splitting requests")
 	// In all other cases, create a new write request containing only one item
 	var writeRequests []apiModel.PlcWriteRequest
 	for _, tagName := range writeRequest.GetTagNames() {
 		if err := ctx.Err(); err != nil {
-			log.Warn().Err(err).Msg("aborting early")
+			m.log.Warn().Err(err).Msg("aborting early")
 			return nil
 		}
-		log.Debug().Str("tagName", tagName).Msg("Splitting into own request")
+		m.log.Debug().Str("tagName", tagName).Msg("Splitting into own request")
 		tag := writeRequest.GetTag(tagName)
 		subWriteRequest := m.writeRequestFactory(
 			map[string]apiModel.PlcTag{tagName: tag},
@@ -238,15 +247,15 @@ func (m SingleItemRequestInterceptor) InterceptWriteRequest(ctx context.Context,
 
 func (m SingleItemRequestInterceptor) ProcessWriteResponses(ctx context.Context, writeRequest apiModel.PlcWriteRequest, writeResults []apiModel.PlcWriteRequestResult) apiModel.PlcWriteRequestResult {
 	if len(writeResults) == 1 {
-		log.Debug().Msg("We got only one response, no merging required")
+		m.log.Debug().Msg("We got only one response, no merging required")
 		return writeResults[0]
 	}
-	log.Trace().Msg("Merging requests")
+	m.log.Trace().Msg("Merging requests")
 	responseCodes := map[string]apiModel.PlcResponseCode{}
 	var err error = nil
 	for _, writeResult := range writeResults {
 		if ctxErr := ctx.Err(); ctxErr != nil {
-			log.Warn().Err(ctxErr).Msg("aborting early")
+			m.log.Warn().Err(ctxErr).Msg("aborting early")
 			if err != nil {
 				multiError := err.(utils.MultiError)
 				multiError.Errors = append(multiError.Errors, ctxErr)
@@ -256,7 +265,7 @@ func (m SingleItemRequestInterceptor) ProcessWriteResponses(ctx context.Context,
 			break
 		}
 		if writeResult.GetErr() != nil {
-			log.Debug().Err(writeResult.GetErr()).Msgf("Error during write")
+			m.log.Debug().Err(writeResult.GetErr()).Msgf("Error during write")
 			if err == nil {
 				// Lazy initialization of multi error
 				err = utils.MultiError{MainError: errors.New("while aggregating results"), Errors: []error{writeResult.GetErr()}}
@@ -266,7 +275,7 @@ func (m SingleItemRequestInterceptor) ProcessWriteResponses(ctx context.Context,
 			}
 		} else if writeResult.GetResponse() != nil {
 			if len(writeResult.GetResponse().GetRequest().GetTagNames()) > 1 {
-				log.Error().Int("numberOfTags", len(writeResult.GetResponse().GetRequest().GetTagNames())).Msg("We should only get 1")
+				m.log.Error().Int("numberOfTags", len(writeResult.GetResponse().GetRequest().GetTagNames())).Msg("We should only get 1")
 			}
 			for _, tagName := range writeResult.GetResponse().GetRequest().GetTagNames() {
 				responseCodes[tagName] = writeResult.GetResponse().GetResponseCode(tagName)
diff --git a/plc4go/spi/testutils/TestUtils.go b/plc4go/spi/testutils/TestUtils.go
index 35773412ea..91904cac6c 100644
--- a/plc4go/spi/testutils/TestUtils.go
+++ b/plc4go/spi/testutils/TestUtils.go
@@ -20,20 +20,23 @@
 package testutils
 
 import (
+	"os"
+	"runtime/debug"
+	"strings"
+	"testing"
+
+	"github.com/apache/plc4x/plc4go/spi/utils"
+
 	"github.com/ajankovic/xdiff"
 	"github.com/ajankovic/xdiff/parser"
-	"github.com/apache/plc4x/plc4go/spi/utils"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 	"github.com/rs/zerolog/log"
 	"github.com/stretchr/testify/assert"
-	"os"
-	"runtime/debug"
-	"strings"
-	"testing"
 )
 
 func CompareResults(t *testing.T, actualString []byte, referenceString []byte) error {
+	localLog := ProduceTestingLogger(t)
 	// Now parse the xml strings of the actual and the reference in xdiff's dom
 	p := parser.New()
 	actual, err := p.ParseBytes(actualString)
@@ -56,7 +59,7 @@ func CompareResults(t *testing.T, actualString []byte, referenceString []byte) e
 	cleanDiff := make([]xdiff.Delta, 0)
 	for _, delta := range diff {
 		if delta.Operation == xdiff.Delete && delta.Subject.Value == nil || delta.Operation == xdiff.Insert && delta.Subject.Value == nil {
-			log.Info().Msgf("We ignore empty elements which should be deleted %v", delta)
+			localLog.Info().Msgf("We ignore empty elements which should be deleted %v", delta)
 			continue
 		}
 		// Workaround for different precisions on float
@@ -66,7 +69,7 @@ func CompareResults(t *testing.T, actualString []byte, referenceString []byte) e
 			string(delta.Object.Parent.FirstChild.Name) == "dataType" &&
 			string(delta.Object.Parent.FirstChild.Value) == "float" {
 			if strings.Contains(string(delta.Subject.Value), string(delta.Object.Value)) || strings.Contains(string(delta.Object.Value), string(delta.Subject.Value)) {
-				log.Info().Msgf("We ignore precision diffs %v", delta)
+				localLog.Info().Msgf("We ignore precision diffs %v", delta)
 				continue
 			}
 		}
@@ -76,7 +79,7 @@ func CompareResults(t *testing.T, actualString []byte, referenceString []byte) e
 			string(delta.Object.Parent.FirstChild.Name) == "dataType" &&
 			string(delta.Object.Parent.FirstChild.Value) == "string" {
 			if diff, err := xdiff.Compare(delta.Subject, delta.Object); diff == nil && err == nil {
-				log.Info().Msgf("We ignore newline diffs %v", delta)
+				localLog.Info().Msgf("We ignore newline diffs %v", delta)
 				continue
 			}
 		}
@@ -88,7 +91,7 @@ func CompareResults(t *testing.T, actualString []byte, referenceString []byte) e
 		return errors.Wrap(err, "Error outputting results")
 	}
 	if len(cleanDiff) <= 0 {
-		log.Warn().Msg("We only found non relevant changes")
+		localLog.Warn().Msg("We only found non relevant changes")
 		return nil
 	}
 
diff --git a/plc4go/spi/transactions/RequestTransactionManager.go b/plc4go/spi/transactions/RequestTransactionManager.go
index ff41af79c2..edd287c6fa 100644
--- a/plc4go/spi/transactions/RequestTransactionManager.go
+++ b/plc4go/spi/transactions/RequestTransactionManager.go
@@ -141,11 +141,11 @@ type requestTransactionManager struct {
 ///////////////////////////////////////
 
 func (r *requestTransactionManager) SetNumberOfConcurrentRequests(numberOfConcurrentRequests int) {
-	log.Info().Msgf("Setting new number of concurrent requests %d", numberOfConcurrentRequests)
+	r.log.Info().Msgf("Setting new number of concurrent requests %d", numberOfConcurrentRequests)
 	// If we reduced the number of concurrent requests and more requests are in-flight
 	// than should be, at least log a warning.
 	if numberOfConcurrentRequests < len(r.runningRequests) {
-		log.Warn().Msg("The number of concurrent requests was reduced and currently more requests are in flight.")
+		r.log.Warn().Msg("The number of concurrent requests was reduced and currently more requests are in flight.")
 	}
 
 	r.numberOfConcurrentRequests = numberOfConcurrentRequests
@@ -167,11 +167,11 @@ func (r *requestTransactionManager) submitTransaction(transaction *requestTransa
 func (r *requestTransactionManager) processWorklog() {
 	r.workLogMutex.RLock()
 	defer r.workLogMutex.RUnlock()
-	log.Debug().Msgf("Processing work log with size of %d (%d concurrent requests allowed)", r.workLog.Len(), r.numberOfConcurrentRequests)
+	r.log.Debug().Msgf("Processing work log with size of %d (%d concurrent requests allowed)", r.workLog.Len(), r.numberOfConcurrentRequests)
 	for len(r.runningRequests) < r.numberOfConcurrentRequests && r.workLog.Len() > 0 {
 		front := r.workLog.Front()
 		next := front.Value.(*requestTransaction)
-		log.Debug().Msgf("Handling next %v. (Adding to running requests (length: %d))", next, len(r.runningRequests))
+		r.log.Debug().Msgf("Handling next %v. (Adding to running requests (length: %d))", next, len(r.runningRequests))
 		r.runningRequests = append(r.runningRequests, next)
 		completionFuture := r.executor.Submit(context.Background(), next.transactionId, next.operation)
 		next.completionFuture = completionFuture
@@ -258,7 +258,7 @@ func (r *requestTransactionManager) CloseGraceful(timeout time.Duration) error {
 		}()
 		select {
 		case <-timer.C:
-			log.Warn().Msgf("timout after %d", timeout)
+			r.log.Warn().Msgf("timout after %d", timeout)
 		case <-signal:
 		}
 	}
@@ -283,7 +283,7 @@ func (t *requestTransaction) EndRequest() error {
 
 func (t *requestTransaction) Submit(operation RequestTransactionRunnable) {
 	if t.operation != nil {
-		log.Warn().Msg("Operation already set")
+		t.transactionLog.Warn().Msg("Operation already set")
 	}
 	t.transactionLog.Trace().Msgf("Submission of transaction %d", t.transactionId)
 	t.operation = func() {
diff --git a/plc4go/spi/transports/TransportInstance.go b/plc4go/spi/transports/TransportInstance.go
index fc3b66d328..e81d6821b9 100644
--- a/plc4go/spi/transports/TransportInstance.go
+++ b/plc4go/spi/transports/TransportInstance.go
@@ -23,8 +23,6 @@ import (
 	"bufio"
 	"context"
 	"fmt"
-	"github.com/pkg/errors"
-	"github.com/rs/zerolog/log"
 )
 
 type TransportInstance interface {
@@ -44,91 +42,3 @@ type TransportInstance interface {
 
 	Write(data []byte) error
 }
-
-type DefaultBufferedTransportInstanceRequirements interface {
-	GetReader() *bufio.Reader
-	Connect() error
-}
-
-type DefaultBufferedTransportInstance interface {
-	ConnectWithContext(ctx context.Context) error
-	GetNumBytesAvailableInBuffer() (uint32, error)
-	FillBuffer(until func(pos uint, currentByte byte, reader *bufio.Reader) bool) error
-	PeekReadableBytes(numBytes uint32) ([]byte, error)
-	Read(numBytes uint32) ([]byte, error)
-}
-
-func NewDefaultBufferedTransportInstance(defaultBufferedTransportInstanceRequirements DefaultBufferedTransportInstanceRequirements) DefaultBufferedTransportInstance {
-	return &defaultBufferedTransportInstance{defaultBufferedTransportInstanceRequirements}
-}
-
-type defaultBufferedTransportInstance struct {
-	DefaultBufferedTransportInstanceRequirements
-}
-
-// ConnectWithContext is a compatibility implementation for those transports not implementing this function
-func (m *defaultBufferedTransportInstance) ConnectWithContext(ctx context.Context) error {
-	ch := make(chan error, 1)
-	go func() {
-		defer func() {
-			if err := recover(); err != nil {
-				log.Error().Interface("err", err).Msg("connect panic-ed")
-			}
-		}()
-		ch <- m.Connect()
-		close(ch)
-	}()
-	select {
-	case err := <-ch:
-		return err
-	case <-ctx.Done():
-		return ctx.Err()
-	}
-}
-
-func (m *defaultBufferedTransportInstance) GetNumBytesAvailableInBuffer() (uint32, error) {
-	if m.GetReader() == nil {
-		return 0, nil
-	}
-	_, _ = m.GetReader().Peek(1)
-	return uint32(m.GetReader().Buffered()), nil
-}
-
-func (m *defaultBufferedTransportInstance) FillBuffer(until func(pos uint, currentByte byte, reader *bufio.Reader) bool) error {
-	if m.GetReader() == nil {
-		return nil
-	}
-	nBytes := uint32(1)
-	for {
-		bytes, err := m.PeekReadableBytes(nBytes)
-		if err != nil {
-			return errors.Wrap(err, "Error while peeking")
-		}
-		if keepGoing := until(uint(nBytes-1), bytes[len(bytes)-1], m.GetReader()); !keepGoing {
-			return nil
-		}
-		nBytes++
-	}
-}
-
-func (m *defaultBufferedTransportInstance) PeekReadableBytes(numBytes uint32) ([]byte, error) {
-	if m.GetReader() == nil {
-		return nil, errors.New("error peeking from transport. No reader available")
-	}
-	return m.GetReader().Peek(int(numBytes))
-}
-
-func (m *defaultBufferedTransportInstance) Read(numBytes uint32) ([]byte, error) {
-	if m.GetReader() == nil {
-		return nil, errors.New("error reading from transport. No reader available")
-	}
-	data := make([]byte, numBytes)
-	for i := uint32(0); i < numBytes; i++ {
-		val, err := m.GetReader().ReadByte()
-		if err != nil {
-			return nil, errors.Wrap(err, "error reading")
-		}
-		data[i] = val
-	}
-	return data, nil
-}
diff --git a/plc4go/spi/transports/mock_DefaultBufferedTransportInstanceRequirements_test.go b/plc4go/spi/transports/mock_DefaultBufferedTransportInstanceRequirements_test.go
deleted file mode 100644
index 732bdb1ef2..0000000000
--- a/plc4go/spi/transports/mock_DefaultBufferedTransportInstanceRequirements_test.go
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by mockery v2.28.1. DO NOT EDIT.
-
-package transports
-
-import (
-	bufio "bufio"
-
-	mock "github.com/stretchr/testify/mock"
-)
-
-// MockDefaultBufferedTransportInstanceRequirements is an autogenerated mock type for the DefaultBufferedTransportInstanceRequirements type
-type MockDefaultBufferedTransportInstanceRequirements struct {
-	mock.Mock
-}
-
-type MockDefaultBufferedTransportInstanceRequirements_Expecter struct {
-	mock *mock.Mock
-}
-
-func (_m *MockDefaultBufferedTransportInstanceRequirements) EXPECT() *MockDefaultBufferedTransportInstanceRequirements_Expecter {
-	return &MockDefaultBufferedTransportInstanceRequirements_Expecter{mock: &_m.Mock}
-}
-
-// Connect provides a mock function with given fields:
-func (_m *MockDefaultBufferedTransportInstanceRequirements) Connect() error {
-	ret := _m.Called()
-
-	var r0 error
-	if rf, ok := ret.Get(0).(func() error); ok {
-		r0 = rf()
-	} else {
-		r0 = ret.Error(0)
-	}
-
-	return r0
-}
-
-// MockDefaultBufferedTransportInstanceRequirements_Connect_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Connect'
-type MockDefaultBufferedTransportInstanceRequirements_Connect_Call struct {
-	*mock.Call
-}
-
-// Connect is a helper method to define mock.On call
-func (_e *MockDefaultBufferedTransportInstanceRequirements_Expecter) Connect() *MockDefaultBufferedTransportInstanceRequirements_Connect_Call {
-	return &MockDefaultBufferedTransportInstanceRequirements_Connect_Call{Call: _e.mock.On("Connect")}
-}
-
-func (_c *MockDefaultBufferedTransportInstanceRequirements_Connect_Call) Run(run func()) *MockDefaultBufferedTransportInstanceRequirements_Connect_Call {
-	_c.Call.Run(func(args mock.Arguments) {
-		run()
-	})
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstanceRequirements_Connect_Call) Return(_a0 error) *MockDefaultBufferedTransportInstanceRequirements_Connect_Call {
-	_c.Call.Return(_a0)
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstanceRequirements_Connect_Call) RunAndReturn(run func() error) *MockDefaultBufferedTransportInstanceRequirements_Connect_Call {
-	_c.Call.Return(run)
-	return _c
-}
-
-// GetReader provides a mock function with given fields:
-func (_m *MockDefaultBufferedTransportInstanceRequirements) GetReader() *bufio.Reader {
-	ret := _m.Called()
-
-	var r0 *bufio.Reader
-	if rf, ok := ret.Get(0).(func() *bufio.Reader); ok {
-		r0 = rf()
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*bufio.Reader)
-		}
-	}
-
-	return r0
-}
-
-// MockDefaultBufferedTransportInstanceRequirements_GetReader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetReader'
-type MockDefaultBufferedTransportInstanceRequirements_GetReader_Call struct {
-	*mock.Call
-}
-
-// GetReader is a helper method to define mock.On call
-func (_e *MockDefaultBufferedTransportInstanceRequirements_Expecter) GetReader() *MockDefaultBufferedTransportInstanceRequirements_GetReader_Call {
-	return &MockDefaultBufferedTransportInstanceRequirements_GetReader_Call{Call: _e.mock.On("GetReader")}
-}
-
-func (_c *MockDefaultBufferedTransportInstanceRequirements_GetReader_Call) Run(run func()) *MockDefaultBufferedTransportInstanceRequirements_GetReader_Call {
-	_c.Call.Run(func(args mock.Arguments) {
-		run()
-	})
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstanceRequirements_GetReader_Call) Return(_a0 *bufio.Reader) *MockDefaultBufferedTransportInstanceRequirements_GetReader_Call {
-	_c.Call.Return(_a0)
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstanceRequirements_GetReader_Call) RunAndReturn(run func() *bufio.Reader) *MockDefaultBufferedTransportInstanceRequirements_GetReader_Call {
-	_c.Call.Return(run)
-	return _c
-}
-
-type mockConstructorTestingTNewMockDefaultBufferedTransportInstanceRequirements interface {
-	mock.TestingT
-	Cleanup(func())
-}
-
-// NewMockDefaultBufferedTransportInstanceRequirements creates a new instance of MockDefaultBufferedTransportInstanceRequirements. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
-func NewMockDefaultBufferedTransportInstanceRequirements(t mockConstructorTestingTNewMockDefaultBufferedTransportInstanceRequirements) *MockDefaultBufferedTransportInstanceRequirements {
-	mock := &MockDefaultBufferedTransportInstanceRequirements{}
-	mock.Mock.Test(t)
-
-	t.Cleanup(func() { mock.AssertExpectations(t) })
-
-	return mock
-}
diff --git a/plc4go/spi/transports/mock_DefaultBufferedTransportInstance_test.go b/plc4go/spi/transports/mock_DefaultBufferedTransportInstance_test.go
deleted file mode 100644
index 7e3e607052..0000000000
--- a/plc4go/spi/transports/mock_DefaultBufferedTransportInstance_test.go
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by mockery v2.28.1. DO NOT EDIT.
-
-package transports
-
-import (
-	bufio "bufio"
-	context "context"
-
-	mock "github.com/stretchr/testify/mock"
-)
-
-// MockDefaultBufferedTransportInstance is an autogenerated mock type for the DefaultBufferedTransportInstance type
-type MockDefaultBufferedTransportInstance struct {
-	mock.Mock
-}
-
-type MockDefaultBufferedTransportInstance_Expecter struct {
-	mock *mock.Mock
-}
-
-func (_m *MockDefaultBufferedTransportInstance) EXPECT() *MockDefaultBufferedTransportInstance_Expecter {
-	return &MockDefaultBufferedTransportInstance_Expecter{mock: &_m.Mock}
-}
-
-// ConnectWithContext provides a mock function with given fields: ctx
-func (_m *MockDefaultBufferedTransportInstance) ConnectWithContext(ctx context.Context) error {
-	ret := _m.Called(ctx)
-
-	var r0 error
-	if rf, ok := ret.Get(0).(func(context.Context) error); ok {
-		r0 = rf(ctx)
-	} else {
-		r0 = ret.Error(0)
-	}
-
-	return r0
-}
-
-// MockDefaultBufferedTransportInstance_ConnectWithContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ConnectWithContext'
-type MockDefaultBufferedTransportInstance_ConnectWithContext_Call struct {
-	*mock.Call
-}
-
-// ConnectWithContext is a helper method to define mock.On call
-//   - ctx context.Context
-func (_e *MockDefaultBufferedTransportInstance_Expecter) ConnectWithContext(ctx interface{}) *MockDefaultBufferedTransportInstance_ConnectWithContext_Call {
-	return &MockDefaultBufferedTransportInstance_ConnectWithContext_Call{Call: _e.mock.On("ConnectWithContext", ctx)}
-}
-
-func (_c *MockDefaultBufferedTransportInstance_ConnectWithContext_Call) Run(run func(ctx context.Context)) *MockDefaultBufferedTransportInstance_ConnectWithContext_Call {
-	_c.Call.Run(func(args mock.Arguments) {
-		run(args[0].(context.Context))
-	})
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_ConnectWithContext_Call) Return(_a0 error) *MockDefaultBufferedTransportInstance_ConnectWithContext_Call {
-	_c.Call.Return(_a0)
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_ConnectWithContext_Call) RunAndReturn(run func(context.Context) error) *MockDefaultBufferedTransportInstance_ConnectWithContext_Call {
-	_c.Call.Return(run)
-	return _c
-}
-
-// FillBuffer provides a mock function with given fields: until
-func (_m *MockDefaultBufferedTransportInstance) FillBuffer(until func(uint, byte, *bufio.Reader) bool) error {
-	ret := _m.Called(until)
-
-	var r0 error
-	if rf, ok := ret.Get(0).(func(func(uint, byte, *bufio.Reader) bool) error); ok {
-		r0 = rf(until)
-	} else {
-		r0 = ret.Error(0)
-	}
-
-	return r0
-}
-
-// MockDefaultBufferedTransportInstance_FillBuffer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FillBuffer'
-type MockDefaultBufferedTransportInstance_FillBuffer_Call struct {
-	*mock.Call
-}
-
-// FillBuffer is a helper method to define mock.On call
-//   - until func(uint , byte , *bufio.Reader) bool
-func (_e *MockDefaultBufferedTransportInstance_Expecter) FillBuffer(until interface{}) *MockDefaultBufferedTransportInstance_FillBuffer_Call {
-	return &MockDefaultBufferedTransportInstance_FillBuffer_Call{Call: _e.mock.On("FillBuffer", until)}
-}
-
-func (_c *MockDefaultBufferedTransportInstance_FillBuffer_Call) Run(run func(until func(uint, byte, *bufio.Reader) bool)) *MockDefaultBufferedTransportInstance_FillBuffer_Call {
-	_c.Call.Run(func(args mock.Arguments) {
-		run(args[0].(func(uint, byte, *bufio.Reader) bool))
-	})
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_FillBuffer_Call) Return(_a0 error) *MockDefaultBufferedTransportInstance_FillBuffer_Call {
-	_c.Call.Return(_a0)
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_FillBuffer_Call) RunAndReturn(run func(func(uint, byte, *bufio.Reader) bool) error) *MockDefaultBufferedTransportInstance_FillBuffer_Call {
-	_c.Call.Return(run)
-	return _c
-}
-
-// GetNumBytesAvailableInBuffer provides a mock function with given fields:
-func (_m *MockDefaultBufferedTransportInstance) GetNumBytesAvailableInBuffer() (uint32, error) {
-	ret := _m.Called()
-
-	var r0 uint32
-	var r1 error
-	if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
-		return rf()
-	}
-	if rf, ok := ret.Get(0).(func() uint32); ok {
-		r0 = rf()
-	} else {
-		r0 = ret.Get(0).(uint32)
-	}
-
-	if rf, ok := ret.Get(1).(func() error); ok {
-		r1 = rf()
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNumBytesAvailableInBuffer'
-type MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call struct {
-	*mock.Call
-}
-
-// GetNumBytesAvailableInBuffer is a helper method to define mock.On call
-func (_e *MockDefaultBufferedTransportInstance_Expecter) GetNumBytesAvailableInBuffer() *MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call {
-	return &MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call{Call: _e.mock.On("GetNumBytesAvailableInBuffer")}
-}
-
-func (_c *MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call) Run(run func()) *MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call {
-	_c.Call.Run(func(args mock.Arguments) {
-		run()
-	})
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call) Return(_a0 uint32, _a1 error) *MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call {
-	_c.Call.Return(_a0, _a1)
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call) RunAndReturn(run func() (uint32, error)) *MockDefaultBufferedTransportInstance_GetNumBytesAvailableInBuffer_Call {
-	_c.Call.Return(run)
-	return _c
-}
-
-// PeekReadableBytes provides a mock function with given fields: numBytes
-func (_m *MockDefaultBufferedTransportInstance) PeekReadableBytes(numBytes uint32) ([]byte, error) {
-	ret := _m.Called(numBytes)
-
-	var r0 []byte
-	var r1 error
-	if rf, ok := ret.Get(0).(func(uint32) ([]byte, error)); ok {
-		return rf(numBytes)
-	}
-	if rf, ok := ret.Get(0).(func(uint32) []byte); ok {
-		r0 = rf(numBytes)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]byte)
-		}
-	}
-
-	if rf, ok := ret.Get(1).(func(uint32) error); ok {
-		r1 = rf(numBytes)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// MockDefaultBufferedTransportInstance_PeekReadableBytes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PeekReadableBytes'
-type MockDefaultBufferedTransportInstance_PeekReadableBytes_Call struct {
-	*mock.Call
-}
-
-// PeekReadableBytes is a helper method to define mock.On call
-//   - numBytes uint32
-func (_e *MockDefaultBufferedTransportInstance_Expecter) PeekReadableBytes(numBytes interface{}) *MockDefaultBufferedTransportInstance_PeekReadableBytes_Call {
-	return &MockDefaultBufferedTransportInstance_PeekReadableBytes_Call{Call: _e.mock.On("PeekReadableBytes", numBytes)}
-}
-
-func (_c *MockDefaultBufferedTransportInstance_PeekReadableBytes_Call) Run(run func(numBytes uint32)) *MockDefaultBufferedTransportInstance_PeekReadableBytes_Call {
-	_c.Call.Run(func(args mock.Arguments) {
-		run(args[0].(uint32))
-	})
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_PeekReadableBytes_Call) Return(_a0 []byte, _a1 error) *MockDefaultBufferedTransportInstance_PeekReadableBytes_Call {
-	_c.Call.Return(_a0, _a1)
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_PeekReadableBytes_Call) RunAndReturn(run func(uint32) ([]byte, error)) *MockDefaultBufferedTransportInstance_PeekReadableBytes_Call {
-	_c.Call.Return(run)
-	return _c
-}
-
-// Read provides a mock function with given fields: numBytes
-func (_m *MockDefaultBufferedTransportInstance) Read(numBytes uint32) ([]byte, error) {
-	ret := _m.Called(numBytes)
-
-	var r0 []byte
-	var r1 error
-	if rf, ok := ret.Get(0).(func(uint32) ([]byte, error)); ok {
-		return rf(numBytes)
-	}
-	if rf, ok := ret.Get(0).(func(uint32) []byte); ok {
-		r0 = rf(numBytes)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]byte)
-		}
-	}
-
-	if rf, ok := ret.Get(1).(func(uint32) error); ok {
-		r1 = rf(numBytes)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// MockDefaultBufferedTransportInstance_Read_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Read'
-type MockDefaultBufferedTransportInstance_Read_Call struct {
-	*mock.Call
-}
-
-// Read is a helper method to define mock.On call
-//   - numBytes uint32
-func (_e *MockDefaultBufferedTransportInstance_Expecter) Read(numBytes interface{}) *MockDefaultBufferedTransportInstance_Read_Call {
-	return &MockDefaultBufferedTransportInstance_Read_Call{Call: _e.mock.On("Read", numBytes)}
-}
-
-func (_c *MockDefaultBufferedTransportInstance_Read_Call) Run(run func(numBytes uint32)) *MockDefaultBufferedTransportInstance_Read_Call {
-	_c.Call.Run(func(args mock.Arguments) {
-		run(args[0].(uint32))
-	})
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_Read_Call) Return(_a0 []byte, _a1 error) *MockDefaultBufferedTransportInstance_Read_Call {
-	_c.Call.Return(_a0, _a1)
-	return _c
-}
-
-func (_c *MockDefaultBufferedTransportInstance_Read_Call) RunAndReturn(run func(uint32) ([]byte, error)) *MockDefaultBufferedTransportInstance_Read_Call {
-	_c.Call.Return(run)
-	return _c
-}
-
-type mockConstructorTestingTNewMockDefaultBufferedTransportInstance interface {
-	mock.TestingT
-	Cleanup(func())
-}
-
-// NewMockDefaultBufferedTransportInstance creates a new instance of MockDefaultBufferedTransportInstance. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
-func NewMockDefaultBufferedTransportInstance(t mockConstructorTestingTNewMockDefaultBufferedTransportInstance) *MockDefaultBufferedTransportInstance {
-	mock := &MockDefaultBufferedTransportInstance{}
-	mock.Mock.Test(t)
-
-	t.Cleanup(func() { mock.AssertExpectations(t) })
-
-	return mock
-}
diff --git a/plc4go/spi/transports/pcap/Transport.go b/plc4go/spi/transports/pcap/Transport.go
index ef455e6364..48f6eabe4e 100644
--- a/plc4go/spi/transports/pcap/Transport.go
+++ b/plc4go/spi/transports/pcap/Transport.go
@@ -25,6 +25,7 @@ import (
 	"fmt"
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/transports"
+	transportUtils "github.com/apache/plc4x/plc4go/spi/transports/utils"
 	"github.com/gopacket/gopacket"
 	"github.com/gopacket/gopacket/layers"
 	"github.com/gopacket/gopacket/pcap"
@@ -89,7 +90,7 @@ func (m Transport) String() string {
 }
 
 type TransportInstance struct {
-	transports.DefaultBufferedTransportInstance
+	transportUtils.DefaultBufferedTransportInstance
 	transportFile string
 	transportType TransportType
 	portRange     string
@@ -113,7 +114,7 @@ func NewPcapTransportInstance(transportFile string, transportType TransportType,
 
 		log: options.ExtractCustomLogger(_options...),
 	}
-	transportInstance.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(transportInstance)
+	transportInstance.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(transportInstance, _options...)
 	return transportInstance
 }
 
diff --git a/plc4go/spi/transports/pcap/Transport_test.go b/plc4go/spi/transports/pcap/Transport_test.go
index 91fda11c7f..9cc013dc96 100644
--- a/plc4go/spi/transports/pcap/Transport_test.go
+++ b/plc4go/spi/transports/pcap/Transport_test.go
@@ -22,6 +22,7 @@ package pcap
 import (
 	"bufio"
 	"github.com/apache/plc4x/plc4go/spi/transports"
+	transportUtils "github.com/apache/plc4x/plc4go/spi/transports/utils"
 	"github.com/gopacket/gopacket"
 	"github.com/gopacket/gopacket/layers"
 	"github.com/gopacket/gopacket/pcap"
@@ -50,7 +51,7 @@ func TestNewPcapTransportInstance(t *testing.T) {
 			name: "create it",
 			want: func() *TransportInstance {
 				ti := &TransportInstance{}
-				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				ti.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(ti)
 				return ti
 			}(),
 		},
@@ -85,7 +86,7 @@ func TestNewTransport(t *testing.T) {
 
 func TestTransportInstance_Close(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		transportFile                    string
 		transportType                    TransportType
 		portRange                        string
@@ -129,7 +130,7 @@ func TestTransportInstance_Close(t *testing.T) {
 
 func TestTransportInstance_Connect(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		transportFile                    string
 		transportType                    TransportType
 		portRange                        string
@@ -193,7 +194,7 @@ func TestTransportInstance_Connect(t *testing.T) {
 
 func TestTransportInstance_GetReader(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		transportFile                    string
 		transportType                    TransportType
 		portRange                        string
@@ -234,7 +235,7 @@ func TestTransportInstance_GetReader(t *testing.T) {
 
 func TestTransportInstance_IsConnected(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		transportFile                    string
 		transportType                    TransportType
 		portRange                        string
@@ -275,7 +276,7 @@ func TestTransportInstance_IsConnected(t *testing.T) {
 
 func TestTransportInstance_String(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		transportFile                    string
 		transportType                    TransportType
 		portRange                        string
@@ -322,7 +323,7 @@ func TestTransportInstance_String(t *testing.T) {
 
 func TestTransportInstance_Write(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		transportFile                    string
 		transportType                    TransportType
 		portRange                        string
@@ -393,7 +394,7 @@ func TestTransport_CreateTransportInstance(t *testing.T) {
 					transport:     NewTransport(),
 					portRange:     "1-3",
 				}
-				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				ti.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(ti)
 				return ti
 			}(),
 		},
diff --git a/plc4go/spi/transports/serial/Transport.go b/plc4go/spi/transports/serial/Transport.go
index 8640121603..9bead476a1 100644
--- a/plc4go/spi/transports/serial/Transport.go
+++ b/plc4go/spi/transports/serial/Transport.go
@@ -22,6 +22,7 @@ package serial
 import (
 	"bufio"
 	"fmt"
+	transportUtils "github.com/apache/plc4x/plc4go/spi/transports/utils"
 	"io"
 	"net"
 	"net/url"
@@ -88,7 +89,7 @@ func (m Transport) String() string {
 }
 
 type TransportInstance struct {
-	transports.DefaultBufferedTransportInstance
+	transportUtils.DefaultBufferedTransportInstance
 	SerialPortName string
 	BaudRate       uint
 	ConnectTimeout uint32
@@ -108,7 +109,7 @@ func NewTransportInstance(serialPortName string, baudRate uint, connectTimeout u
 
 		log: options.ExtractCustomLogger(_options...),
 	}
-	transportInstance.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(transportInstance)
+	transportInstance.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(transportInstance, _options...)
 	return transportInstance
 }
 
diff --git a/plc4go/spi/transports/serial/Transport_test.go b/plc4go/spi/transports/serial/Transport_test.go
index 4cb04a9ac5..cf4b32c407 100644
--- a/plc4go/spi/transports/serial/Transport_test.go
+++ b/plc4go/spi/transports/serial/Transport_test.go
@@ -22,6 +22,7 @@ package serial
 import (
 	"bufio"
 	"github.com/apache/plc4x/plc4go/spi/transports"
+	transportUtils "github.com/apache/plc4x/plc4go/spi/transports/utils"
 	"github.com/stretchr/testify/assert"
 	"io"
 	"net"
@@ -73,7 +74,7 @@ func TestNewTransportInstance(t *testing.T) {
 
 func TestTransportInstance_Close(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		SerialPortName                   string
 		BaudRate                         uint
 		ConnectTimeout                   uint32
@@ -108,7 +109,7 @@ func TestTransportInstance_Close(t *testing.T) {
 
 func TestTransportInstance_Connect(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		SerialPortName                   string
 		BaudRate                         uint
 		ConnectTimeout                   uint32
@@ -143,7 +144,7 @@ func TestTransportInstance_Connect(t *testing.T) {
 
 func TestTransportInstance_GetReader(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		SerialPortName                   string
 		BaudRate                         uint
 		ConnectTimeout                   uint32
@@ -178,7 +179,7 @@ func TestTransportInstance_GetReader(t *testing.T) {
 
 func TestTransportInstance_IsConnected(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		SerialPortName                   string
 		BaudRate                         uint
 		ConnectTimeout                   uint32
@@ -213,7 +214,7 @@ func TestTransportInstance_IsConnected(t *testing.T) {
 
 func TestTransportInstance_String(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		SerialPortName                   string
 		BaudRate                         uint
 		ConnectTimeout                   uint32
@@ -248,7 +249,7 @@ func TestTransportInstance_String(t *testing.T) {
 
 func TestTransportInstance_Write(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		SerialPortName                   string
 		BaudRate                         uint
 		ConnectTimeout                   uint32
diff --git a/plc4go/spi/transports/tcp/Transport.go b/plc4go/spi/transports/tcp/Transport.go
index 26f84c2782..5d6667f8ac 100644
--- a/plc4go/spi/transports/tcp/Transport.go
+++ b/plc4go/spi/transports/tcp/Transport.go
@@ -30,6 +30,7 @@ import (
 
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/transports"
+	transportUtils "github.com/apache/plc4x/plc4go/spi/transports/utils"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 
 	"github.com/pkg/errors"
@@ -99,7 +100,7 @@ func (m Transport) String() string {
 }
 
 type TransportInstance struct {
-	transports.DefaultBufferedTransportInstance
+	transportUtils.DefaultBufferedTransportInstance
 	RemoteAddress  *net.TCPAddr
 	LocalAddress   *net.TCPAddr
 	ConnectTimeout uint32
@@ -118,7 +119,7 @@ func NewTcpTransportInstance(remoteAddress *net.TCPAddr, connectTimeout uint32,
 
 		log: options.ExtractCustomLogger(_options...),
 	}
-	transportInstance.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(transportInstance)
+	transportInstance.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(transportInstance, _options...)
 	return transportInstance
 }
 
diff --git a/plc4go/spi/transports/tcp/Transport_test.go b/plc4go/spi/transports/tcp/Transport_test.go
index 8eb9ae8093..540e82ef32 100644
--- a/plc4go/spi/transports/tcp/Transport_test.go
+++ b/plc4go/spi/transports/tcp/Transport_test.go
@@ -24,6 +24,7 @@ import (
 	"context"
 	"fmt"
 	"github.com/apache/plc4x/plc4go/spi/transports"
+	transportUtils "github.com/apache/plc4x/plc4go/spi/transports/utils"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"golang.org/x/net/nettest"
@@ -47,7 +48,7 @@ func TestNewTcpTransportInstance(t *testing.T) {
 			name: "create it",
 			want: func() *TransportInstance {
 				ti := &TransportInstance{}
-				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				ti.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(ti)
 				return ti
 			}(),
 		},
@@ -82,7 +83,7 @@ func TestNewTransport(t *testing.T) {
 
 func TestTransportInstance_Close(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		RemoteAddress                    *net.TCPAddr
 		LocalAddress                     *net.TCPAddr
 		ConnectTimeout                   uint32
@@ -148,7 +149,7 @@ func TestTransportInstance_Close(t *testing.T) {
 
 func TestTransportInstance_Connect(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		RemoteAddress                    *net.TCPAddr
 		LocalAddress                     *net.TCPAddr
 		ConnectTimeout                   uint32
@@ -186,7 +187,7 @@ func TestTransportInstance_Connect(t *testing.T) {
 
 func TestTransportInstance_ConnectWithContext(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		RemoteAddress                    *net.TCPAddr
 		LocalAddress                     *net.TCPAddr
 		ConnectTimeout                   uint32
@@ -249,7 +250,7 @@ func TestTransportInstance_ConnectWithContext(t *testing.T) {
 
 func TestTransportInstance_GetReader(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		RemoteAddress                    *net.TCPAddr
 		LocalAddress                     *net.TCPAddr
 		ConnectTimeout                   uint32
@@ -286,7 +287,7 @@ func TestTransportInstance_GetReader(t *testing.T) {
 
 func TestTransportInstance_IsConnected(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		RemoteAddress                    *net.TCPAddr
 		LocalAddress                     *net.TCPAddr
 		ConnectTimeout                   uint32
@@ -323,7 +324,7 @@ func TestTransportInstance_IsConnected(t *testing.T) {
 
 func TestTransportInstance_String(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		RemoteAddress                    *net.TCPAddr
 		LocalAddress                     *net.TCPAddr
 		ConnectTimeout                   uint32
@@ -369,7 +370,7 @@ func TestTransportInstance_String(t *testing.T) {
 
 func TestTransportInstance_Write(t *testing.T) {
 	type fields struct {
-		DefaultBufferedTransportInstance transports.DefaultBufferedTransportInstance
+		DefaultBufferedTransportInstance transportUtils.DefaultBufferedTransportInstance
 		RemoteAddress                    *net.TCPAddr
 		LocalAddress                     *net.TCPAddr
 		ConnectTimeout                   uint32
@@ -458,7 +459,7 @@ func TestTransport_CreateTransportInstance(t *testing.T) {
 					RemoteAddress:  tcpAddr,
 					ConnectTimeout: 1000,
 				}
-				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				ti.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(ti)
 				return ti
 			}(),
 		},
@@ -475,7 +476,7 @@ func TestTransport_CreateTransportInstance(t *testing.T) {
 					RemoteAddress:  tcpAddr,
 					ConnectTimeout: 1000,
 				}
-				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				ti.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(ti)
 				return ti
 			}(),
 		},
@@ -492,7 +493,7 @@ func TestTransport_CreateTransportInstance(t *testing.T) {
 					RemoteAddress:  tcpAddr,
 					ConnectTimeout: 1000,
 				}
-				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				ti.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(ti)
 				return ti
 			}(),
 		},
@@ -526,7 +527,7 @@ func TestTransport_CreateTransportInstance(t *testing.T) {
 					RemoteAddress:  tcpAddr,
 					ConnectTimeout: 1000,
 				}
-				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				ti.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(ti)
 				return ti
 			}(),
 		},
@@ -557,7 +558,7 @@ func TestTransport_CreateTransportInstance(t *testing.T) {
 					RemoteAddress:  tcpAddr,
 					ConnectTimeout: 123,
 				}
-				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				ti.DefaultBufferedTransportInstance = transportUtils.NewDefaultBufferedTransportInstance(ti)
 				return ti
 			}(),
 		},
diff --git a/plc4go/spi/transports/TransportInstance.go b/plc4go/spi/transports/utils/DefaultBufferedTransportInstance.go
similarity index 78%
copy from plc4go/spi/transports/TransportInstance.go
copy to plc4go/spi/transports/utils/DefaultBufferedTransportInstance.go
index fc3b66d328..922ed57ca3 100644
--- a/plc4go/spi/transports/TransportInstance.go
+++ b/plc4go/spi/transports/utils/DefaultBufferedTransportInstance.go
@@ -17,33 +17,17 @@
  * under the License.
  */
 
-package transports
+package utils
 
 import (
 	"bufio"
 	"context"
-	"fmt"
-	"github.com/pkg/errors"
-	"github.com/rs/zerolog/log"
-)
-
-type TransportInstance interface {
-	fmt.Stringer
-	Connect() error
-	ConnectWithContext(ctx context.Context) error
-	Close() error
 
-	IsConnected() bool
+	"github.com/apache/plc4x/plc4go/spi/options"
 
-	// FillBuffer fills the buffer `until` false (Useful in conjunction if you want GetNumBytesAvailableInBuffer)
-	FillBuffer(until func(pos uint, currentByte byte, reader *bufio.Reader) bool) error
-	// GetNumBytesAvailableInBuffer returns the bytes currently available in buffer (!!!Careful: if you looking for a termination you have to use FillBuffer)
-	GetNumBytesAvailableInBuffer() (uint32, error)
-	PeekReadableBytes(numBytes uint32) ([]byte, error)
-	Read(numBytes uint32) ([]byte, error)
-
-	Write(data []byte) error
-}
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog"
+)
 
 type DefaultBufferedTransportInstanceRequirements interface {
 	GetReader() *bufio.Reader
@@ -58,12 +42,17 @@ type DefaultBufferedTransportInstance interface {
 	Read(numBytes uint32) ([]byte, error)
 }
 
-func NewDefaultBufferedTransportInstance(defaultBufferedTransportInstanceRequirements DefaultBufferedTransportInstanceRequirements) DefaultBufferedTransportInstance {
-	return &defaultBufferedTransportInstance{defaultBufferedTransportInstanceRequirements}
+func NewDefaultBufferedTransportInstance(defaultBufferedTransportInstanceRequirements DefaultBufferedTransportInstanceRequirements, _options ...options.WithOption) DefaultBufferedTransportInstance {
+	return &defaultBufferedTransportInstance{
+		DefaultBufferedTransportInstanceRequirements: defaultBufferedTransportInstanceRequirements,
+		log: options.ExtractCustomLogger(_options...),
+	}
 }
 
 type defaultBufferedTransportInstance struct {
 	DefaultBufferedTransportInstanceRequirements
+
+	log zerolog.Logger
 }
 
 // ConnectWithContext is a compatibility implementation for those transports not implementing this function
@@ -72,7 +61,7 @@ func (m *defaultBufferedTransportInstance) ConnectWithContext(ctx context.Contex
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				log.Error().Interface("err", err).Msg("connect panic-ed")
+				m.log.Error().Interface("err", err).Msg("connect panic-ed")
 			}
 		}()
 		ch <- m.Connect()
diff --git a/plc4go/spi/transports/TransportInstance_test.go b/plc4go/spi/transports/utils/DefaultBufferedTransportInstance_test.go
similarity index 99%
rename from plc4go/spi/transports/TransportInstance_test.go
rename to plc4go/spi/transports/utils/DefaultBufferedTransportInstance_test.go
index e237fd481c..b9cfe9842b 100644
--- a/plc4go/spi/transports/TransportInstance_test.go
+++ b/plc4go/spi/transports/utils/DefaultBufferedTransportInstance_test.go
@@ -17,15 +17,16 @@
  * under the License.
  */
 
-package transports
+package utils
 
 import (
 	"bufio"
 	"bytes"
 	"context"
-	"github.com/stretchr/testify/assert"
 	"testing"
 	"time"
+
+	"github.com/stretchr/testify/assert"
 )
 
 func TestNewDefaultBufferedTransportInstance(t *testing.T) {
diff --git a/plc4go/spi/utils/Net.go b/plc4go/spi/utils/Net.go
index d48cc6b45f..cff8137a6f 100644
--- a/plc4go/spi/utils/Net.go
+++ b/plc4go/spi/utils/Net.go
@@ -33,7 +33,7 @@ import (
 	"github.com/pkg/errors"
 )
 
-func GetIPAddresses(log zerolog.Logger, ctx context.Context, netInterface net.Interface, useArpBasedScan bool) (foundIps chan net.IP, err error) {
+func GetIPAddresses(localLog zerolog.Logger, ctx context.Context, netInterface net.Interface, useArpBasedScan bool) (foundIps chan net.IP, err error) {
 	foundIps = make(chan net.IP, 65536)
 	addrs, err := netInterface.Addrs()
 	if err != nil {
@@ -42,7 +42,7 @@ func GetIPAddresses(log zerolog.Logger, ctx context.Context, netInterface net.In
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				log.Error().Msgf("panic-ed %v", err)
+				localLog.Error().Msgf("panic-ed %v", err)
 			}
 		}()
 		wg := &sync.WaitGroup{}
@@ -69,21 +69,21 @@ func GetIPAddresses(log zerolog.Logger, ctx context.Context, netInterface net.In
 				continue
 			}
 
-			log.Debug().Stringer("IP", ipnet.IP).Stringer("Mask", ipnet.Mask).Msg("Expanding local subnet")
+			localLog.Debug().Stringer("IP", ipnet.IP).Stringer("Mask", ipnet.Mask).Msg("Expanding local subnet")
 			if useArpBasedScan {
-				if err := lockupIpsUsingArp(log, ctx, netInterface, ipnet, foundIps, wg); err != nil {
-					log.Error().Err(err).Msg("failing to resolve using arp scan. Falling back to ip based scan")
+				if err := lockupIpsUsingArp(localLog, ctx, netInterface, ipnet, foundIps, wg); err != nil {
+					localLog.Error().Err(err).Msg("failing to resolve using arp scan. Falling back to ip based scan")
 					useArpBasedScan = false
 				}
 			}
 			if !useArpBasedScan {
-				if err := lookupIps(log, ctx, ipnet, foundIps, wg); err != nil {
-					log.Error().Err(err).Msg("error looking up ips")
+				if err := lookupIps(localLog, ctx, ipnet, foundIps, wg); err != nil {
+					localLog.Error().Err(err).Msg("error looking up ips")
 				}
 			}
 		}
 		wg.Wait()
-		log.Trace().Msg("Closing found ips channel")
+		localLog.Trace().Msg("Closing found ips channel")
 		close(foundIps)
 	}()
 	return foundIps, nil
@@ -92,11 +92,11 @@ func GetIPAddresses(log zerolog.Logger, ctx context.Context, netInterface net.In
 // As PING operations might be blocked by a firewall, responding to ARP packets is mandatory for IP based
 // systems. So we are using an ARP scan to resolve the ethernet hardware addresses of each possible ip in range
 // Only for devices that respond will we schedule a discovery.
-func lockupIpsUsingArp(log zerolog.Logger, ctx context.Context, netInterface net.Interface, ipNet *net.IPNet, foundIps chan net.IP, wg *sync.WaitGroup) error {
+func lockupIpsUsingArp(localLog zerolog.Logger, ctx context.Context, netInterface net.Interface, ipNet *net.IPNet, foundIps chan net.IP, wg *sync.WaitGroup) error {
 	// We add on signal for error handling
 	wg.Add(1)
 	go func() { wg.Done() }()
-	log.Debug().Msgf("Scanning for alive IP addresses for interface '%s' and net: %s", netInterface.Name, ipNet)
+	localLog.Debug().Msgf("Scanning for alive IP addresses for interface '%s' and net: %s", netInterface.Name, ipNet)
 	// First find the pcap device name for the given interface.
 	allDevs, _ := pcap.FindAllDevs()
 	var devName string
@@ -109,7 +109,7 @@ func lockupIpsUsingArp(log zerolog.Logger, ctx context.Context, netInterface net
 		}
 	}
 	if len(devName) == 0 {
-		log.Error().Interface("allDevs", allDevs).Str("ip", ipNet.IP.String()).Msg("Device for discovery not found")
+		localLog.Error().Interface("allDevs", allDevs).Str("ip", ipNet.IP.String()).Msg("Device for discovery not found")
 		return errors.New("Device for discovery not found")
 	}
 
@@ -127,7 +127,7 @@ func lockupIpsUsingArp(log zerolog.Logger, ctx context.Context, netInterface net
 	go func(handle *pcap.Handle, iface net.Interface, stop chan struct{}) {
 		defer func() {
 			if err := recover(); err != nil {
-				log.Error().Msgf("panic-ed %v", err)
+				localLog.Error().Msgf("panic-ed %v", err)
 			}
 		}()
 		src := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet)
@@ -152,7 +152,7 @@ func lockupIpsUsingArp(log zerolog.Logger, ctx context.Context, netInterface net
 				}
 				// Schedule a discovery operation for this ip.
 				ip := net.IP(arp.SourceProtAddress)
-				log.Trace().Msgf("Scheduling discovery for IP %s", ip)
+				localLog.Trace().Msgf("Scheduling discovery for IP %s", ip)
 				timeout := time.NewTimer(2 * time.Second)
 				go func(ip net.IP) {
 					defer CleanupTimer(timeout)
@@ -197,7 +197,7 @@ func lockupIpsUsingArp(log zerolog.Logger, ctx context.Context, netInterface net
 			FixLengths:       true,
 			ComputeChecksums: true,
 		}
-		log.Debug().Msgf("Sending ARP requests to all devices in network: %s", addr.String())
+		localLog.Debug().Msgf("Sending ARP requests to all devices in network: %s", addr.String())
 		// Send one ARP packet for every possible address.
 		for ip := IncrementIP(addr.IP.Mask(ipNet.Mask)); addr.Contains(ip) && addr.Contains(IncrementIP(DuplicateIP(ip))); ip = IncrementIP(ip) {
 			// Check if context has been cancelled before continuing
@@ -218,15 +218,15 @@ func lockupIpsUsingArp(log zerolog.Logger, ctx context.Context, netInterface net
 	}
 	// Write our scan packets out to the handle.
 	if err := writeArp(handle, netInterface, *ipNet); err != nil {
-		log.Printf("error writing packets on %v: %v", netInterface.Name, err)
+		localLog.Printf("error writing packets on %v: %v", netInterface.Name, err)
 		return err
 	}
 	return nil
 }
 
 // Simply takes the IP address and the netmask and schedules one discovery task for every possible IP
-func lookupIps(log zerolog.Logger, ctx context.Context, ipnet *net.IPNet, foundIps chan net.IP, wg *sync.WaitGroup) error {
-	log.Debug().Msgf("Scanning all IP addresses for network: %s", ipnet)
+func lookupIps(localLog zerolog.Logger, ctx context.Context, ipnet *net.IPNet, foundIps chan net.IP, wg *sync.WaitGroup) error {
+	localLog.Debug().Msgf("Scanning all IP addresses for network: %s", ipnet)
 	// expand CIDR-block into one target for each IP
 	// Remark: The last IP address a network contains is a special broadcast address. We don't want to check that one.
 	for ip := IncrementIP(ipnet.IP.Mask(ipnet.Mask)); ipnet.Contains(ip) && ipnet.Contains(IncrementIP(DuplicateIP(ip))); ip = IncrementIP(ip) {
@@ -248,10 +248,10 @@ func lookupIps(log zerolog.Logger, ctx context.Context, ipnet *net.IPNet, foundI
 			case <-timeout.C:
 			}
 		}(DuplicateIP(ip))
-		log.Trace().Stringer("IP", ip).Msg("Expanded CIDR")
+		localLog.Trace().Stringer("IP", ip).Msg("Expanded CIDR")
 	}
 
-	log.Debug().Stringer("net", ipnet).Msg("Done expanding CIDR")
+	localLog.Debug().Stringer("net", ipnet).Msg("Done expanding CIDR")
 
 	return nil
 }