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