diff --git a/filter/chainsync/chainsync.go b/filter/chainsync/chainsync.go index 15c34ef..c2db1a4 100644 --- a/filter/chainsync/chainsync.go +++ b/filter/chainsync/chainsync.go @@ -22,12 +22,14 @@ import ( "github.com/blinklabs-io/gouroboros/ledger" "github.com/blinklabs-io/snek/event" "github.com/blinklabs-io/snek/input/chainsync" + "github.com/blinklabs-io/snek/plugin" ) type ChainSync struct { errorChan chan error inputChan chan event.Event outputChan chan event.Event + logger plugin.Logger filterAddresses []string filterAssetFingerprints []string filterPolicyIds []string diff --git a/filter/chainsync/option.go b/filter/chainsync/option.go index 5739e52..5842419 100644 --- a/filter/chainsync/option.go +++ b/filter/chainsync/option.go @@ -14,8 +14,17 @@ package chainsync +import "github.com/blinklabs-io/snek/plugin" + type ChainSyncOptionFunc func(*ChainSync) +// WithLogger specifies the logger object to use for logging messages +func WithLogger(logger plugin.Logger) ChainSyncOptionFunc { + return func(c *ChainSync) { + c.logger = logger + } +} + // WithAddresses specfies the address to filter on func WithAddresses(addresses []string) ChainSyncOptionFunc { return func(c *ChainSync) { diff --git a/filter/chainsync/plugin.go b/filter/chainsync/plugin.go index 88c2f60..6c09c94 100644 --- a/filter/chainsync/plugin.go +++ b/filter/chainsync/plugin.go @@ -17,6 +17,7 @@ package chainsync import ( "strings" + "github.com/blinklabs-io/snek/internal/logging" "github.com/blinklabs-io/snek/plugin" ) @@ -73,7 +74,11 @@ func init() { } func NewFromCmdlineOptions() plugin.Plugin { - pluginOptions := []ChainSyncOptionFunc{} + pluginOptions := []ChainSyncOptionFunc{ + WithLogger( + logging.GetLogger().With("plugin", "filter.chainsync"), + ), + } if cmdlineOptions.address != "" { pluginOptions = append( pluginOptions, diff --git a/filter/event/event.go b/filter/event/event.go index 81d91f8..d26987e 100644 --- a/filter/event/event.go +++ b/filter/event/event.go @@ -16,12 +16,14 @@ package event import ( "github.com/blinklabs-io/snek/event" + "github.com/blinklabs-io/snek/plugin" ) type Event struct { errorChan chan error inputChan chan event.Event outputChan chan event.Event + logger plugin.Logger filterTypes []string } diff --git a/filter/event/option.go b/filter/event/option.go index 35902a8..4bb7c4b 100644 --- a/filter/event/option.go +++ b/filter/event/option.go @@ -14,8 +14,17 @@ package event +import "github.com/blinklabs-io/snek/plugin" + type EventOptionFunc func(*Event) +// WithLogger specifies the logger object to use for logging messages +func WithLogger(logger plugin.Logger) EventOptionFunc { + return func(e *Event) { + e.logger = logger + } +} + // WithTypes specfies the event types to filter on func WithTypes(eventTypes []string) EventOptionFunc { return func(e *Event) { diff --git a/filter/event/plugin.go b/filter/event/plugin.go index c1b365c..41ba28d 100644 --- a/filter/event/plugin.go +++ b/filter/event/plugin.go @@ -17,6 +17,7 @@ package event import ( "strings" + "github.com/blinklabs-io/snek/internal/logging" "github.com/blinklabs-io/snek/plugin" ) @@ -46,7 +47,11 @@ func init() { } func NewFromCmdlineOptions() plugin.Plugin { - pluginOptions := []EventOptionFunc{} + pluginOptions := []EventOptionFunc{ + WithLogger( + logging.GetLogger().With("plugin", "filter.event"), + ), + } if cmdlineOptions.eventType != "" { pluginOptions = append( pluginOptions, diff --git a/input/chainsync/chainsync.go b/input/chainsync/chainsync.go index a909aa5..a04fe79 100644 --- a/input/chainsync/chainsync.go +++ b/input/chainsync/chainsync.go @@ -20,6 +20,7 @@ import ( "time" "github.com/blinklabs-io/snek/event" + "github.com/blinklabs-io/snek/plugin" ouroboros "github.com/blinklabs-io/gouroboros" "github.com/blinklabs-io/gouroboros/ledger" @@ -30,6 +31,7 @@ import ( type ChainSync struct { oConn *ouroboros.Connection + logger plugin.Logger network string networkMagic uint32 address string @@ -192,6 +194,9 @@ func (c *ChainSync) setupConnection() error { if err := c.oConn.Dial(dialFamily, dialAddress); err != nil { return err } + if c.logger != nil { + c.logger.Infof("connected to node at %s", dialAddress) + } // Start async error handler go func() { err, ok := <-c.oConn.ErrorChan() diff --git a/input/chainsync/options.go b/input/chainsync/options.go index eb8c4c3..53215d8 100644 --- a/input/chainsync/options.go +++ b/input/chainsync/options.go @@ -16,28 +16,36 @@ package chainsync import ( ocommon "github.com/blinklabs-io/gouroboros/protocol/common" + "github.com/blinklabs-io/snek/plugin" ) type ChainSyncOptionFunc func(*ChainSync) +// WithLogger specifies the logger object to use for logging messages +func WithLogger(logger plugin.Logger) ChainSyncOptionFunc { + return func(c *ChainSync) { + c.logger = logger + } +} + // WithNetwork specifies the network func WithNetwork(network string) ChainSyncOptionFunc { - return func(o *ChainSync) { - o.network = network + return func(c *ChainSync) { + c.network = network } } // WithNetworkMagic specifies the network magic value func WithNetworkMagic(networkMagic uint32) ChainSyncOptionFunc { - return func(o *ChainSync) { - o.networkMagic = networkMagic + return func(c *ChainSync) { + c.networkMagic = networkMagic } } // WithNtcTcp specifies whether to use the NtC (node-to-client) protocol over TCP. This is useful when exposing a node's UNIX socket via socat or similar. The default is to use the NtN (node-to-node) protocol over TCP func WithNtcTcp(ntcTcp bool) ChainSyncOptionFunc { - return func(o *ChainSync) { - o.ntcTcp = ntcTcp + return func(c *ChainSync) { + c.ntcTcp = ntcTcp } } diff --git a/input/chainsync/plugin.go b/input/chainsync/plugin.go index 44bc397..3b5d4f4 100644 --- a/input/chainsync/plugin.go +++ b/input/chainsync/plugin.go @@ -19,6 +19,7 @@ import ( "strconv" "strings" + "github.com/blinklabs-io/snek/internal/logging" "github.com/blinklabs-io/snek/plugin" ocommon "github.com/blinklabs-io/gouroboros/protocol/common" @@ -116,6 +117,9 @@ func init() { func NewFromCmdlineOptions() plugin.Plugin { opts := []ChainSyncOptionFunc{ + WithLogger( + logging.GetLogger().With("plugin", "input.chainsync"), + ), WithNetwork(cmdlineOptions.network), WithNetworkMagic(uint32(cmdlineOptions.networkMagic)), WithAddress(cmdlineOptions.address), diff --git a/output/log/log.go b/output/log/log.go index dca7fc6..c22a5a7 100644 --- a/output/log/log.go +++ b/output/log/log.go @@ -17,25 +17,39 @@ package log import ( "github.com/blinklabs-io/snek/event" "github.com/blinklabs-io/snek/internal/logging" + "github.com/blinklabs-io/snek/plugin" ) type LogOutput struct { - errorChan chan error - eventChan chan event.Event - logger *logging.Logger - level string + errorChan chan error + eventChan chan event.Event + logger plugin.Logger + outputLogger *logging.Logger + level string } func New(options ...LogOptionFunc) *LogOutput { l := &LogOutput{ errorChan: make(chan error), eventChan: make(chan event.Event, 10), - logger: logging.GetLogger().With("type", "event"), level: "info", } for _, option := range options { option(l) } + if l.logger == nil { + l.logger = logging.GetLogger() + } + // Determine if we can use the provided logger or need our own + // This is necessary because this plugin uses logger functions that aren't part + // of the plugin.Logger interface + switch v := l.logger.(type) { + case *logging.Logger: + l.outputLogger = v + default: + l.outputLogger = logging.GetLogger() + } + l.outputLogger = l.outputLogger.With("type", "event") return l } @@ -50,14 +64,14 @@ func (l *LogOutput) Start() error { } switch l.level { case "info": - l.logger.Infow("", "event", evt) + l.outputLogger.Infow("", "event", evt) case "warn": - l.logger.Warnw("", "event", evt) + l.outputLogger.Warnw("", "event", evt) case "error": - l.logger.Errorw("", "event", evt) + l.outputLogger.Errorw("", "event", evt) default: // Use INFO level if log level isn't recognized - l.logger.Infow("", "event", evt) + l.outputLogger.Infow("", "event", evt) } } }() diff --git a/output/log/options.go b/output/log/options.go index ebdbc24..b49edc1 100644 --- a/output/log/options.go +++ b/output/log/options.go @@ -14,8 +14,17 @@ package log +import "github.com/blinklabs-io/snek/plugin" + type LogOptionFunc func(*LogOutput) +// WithLogger specifies the logger object to use for logging messages +func WithLogger(logger plugin.Logger) LogOptionFunc { + return func(o *LogOutput) { + o.logger = logger + } +} + // WithLevel specifies the logging level func WithLevel(level string) LogOptionFunc { return func(o *LogOutput) { diff --git a/output/log/plugin.go b/output/log/plugin.go index 8114408..559c010 100644 --- a/output/log/plugin.go +++ b/output/log/plugin.go @@ -15,6 +15,7 @@ package log import ( + "github.com/blinklabs-io/snek/internal/logging" "github.com/blinklabs-io/snek/plugin" ) @@ -44,6 +45,9 @@ func init() { func NewFromCmdlineOptions() plugin.Plugin { p := New( + WithLogger( + logging.GetLogger().With("plugin", "output.log"), + ), WithLevel(cmdlineOptions.level), ) return p diff --git a/output/notify/notify.go b/output/notify/notify.go index e454df7..e6dd7e0 100644 --- a/output/notify/notify.go +++ b/output/notify/notify.go @@ -19,12 +19,14 @@ import ( "github.com/blinklabs-io/snek/event" "github.com/blinklabs-io/snek/input/chainsync" + "github.com/blinklabs-io/snek/plugin" "github.com/gen2brain/beeep" ) type NotifyOutput struct { errorChan chan error eventChan chan event.Event + logger plugin.Logger title string } diff --git a/output/notify/options.go b/output/notify/options.go index 2dad323..db39e20 100644 --- a/output/notify/options.go +++ b/output/notify/options.go @@ -14,10 +14,19 @@ package notify +import "github.com/blinklabs-io/snek/plugin" + // import "github.com/blinklabs-io/snek/event" type NotifyOptionFunc func(*NotifyOutput) +// WithLogger specifies the logger object to use for logging messages +func WithLogger(logger plugin.Logger) NotifyOptionFunc { + return func(o *NotifyOutput) { + o.logger = logger + } +} + // WithTitle specifies the notification title func WithTitle(title string) NotifyOptionFunc { return func(o *NotifyOutput) { diff --git a/output/notify/plugin.go b/output/notify/plugin.go index 4c83aeb..2973c19 100644 --- a/output/notify/plugin.go +++ b/output/notify/plugin.go @@ -15,6 +15,7 @@ package notify import ( + "github.com/blinklabs-io/snek/internal/logging" "github.com/blinklabs-io/snek/plugin" ) @@ -44,6 +45,9 @@ func init() { func NewFromCmdlineOptions() plugin.Plugin { p := New( + WithLogger( + logging.GetLogger().With("plugin", "output.notify"), + ), WithTitle(cmdlineOptions.title), ) return p diff --git a/output/push/options.go b/output/push/options.go index dee0a7d..11778df 100644 --- a/output/push/options.go +++ b/output/push/options.go @@ -14,8 +14,17 @@ package push +import "github.com/blinklabs-io/snek/plugin" + type PushOptionFunc func(*PushOutput) +// WithLogger specifies the logger object to use for logging messages +func WithLogger(logger plugin.Logger) PushOptionFunc { + return func(o *PushOutput) { + o.logger = logger + } +} + func WithServiceAccountFilePath(serviceAccountFilePath string) PushOptionFunc { return func(o *PushOutput) { o.serviceAccountFilePath = serviceAccountFilePath diff --git a/output/push/plugin.go b/output/push/plugin.go index dc5e2b3..abc612b 100644 --- a/output/push/plugin.go +++ b/output/push/plugin.go @@ -15,6 +15,7 @@ package push import ( + "github.com/blinklabs-io/snek/internal/logging" "github.com/blinklabs-io/snek/plugin" ) @@ -52,6 +53,9 @@ func init() { func NewFromCmdlineOptions() plugin.Plugin { p := New( + WithLogger( + logging.GetLogger().With("plugin", "output.push"), + ), WithAccessTokenUrl(cmdlineOptions.accessTokenUrl), WithServiceAccountFilePath(cmdlineOptions.serviceAccountFilePath), ) diff --git a/output/push/push.go b/output/push/push.go index c8e7c75..f6a138f 100644 --- a/output/push/push.go +++ b/output/push/push.go @@ -24,12 +24,14 @@ import ( "github.com/blinklabs-io/snek/fcm" "github.com/blinklabs-io/snek/input/chainsync" "github.com/blinklabs-io/snek/internal/logging" + "github.com/blinklabs-io/snek/plugin" "golang.org/x/oauth2/google" ) type PushOutput struct { errorChan chan error eventChan chan event.Event + logger plugin.Logger accessToken string accessTokenUrl string projectID string diff --git a/output/webhook/options.go b/output/webhook/options.go index af6cfc5..3f1f900 100644 --- a/output/webhook/options.go +++ b/output/webhook/options.go @@ -14,10 +14,19 @@ package webhook +import "github.com/blinklabs-io/snek/plugin" + // import "github.com/blinklabs-io/snek/event" type WebhookOptionFunc func(*WebhookOutput) +// WithLogger specifies the logger object to use for logging messages +func WithLogger(logger plugin.Logger) WebhookOptionFunc { + return func(o *WebhookOutput) { + o.logger = logger + } +} + // WithUrl specifies the webhook URL func WithUrl(url string) WebhookOptionFunc { return func(o *WebhookOutput) { diff --git a/output/webhook/plugin.go b/output/webhook/plugin.go index 49a9f48..76fdb83 100644 --- a/output/webhook/plugin.go +++ b/output/webhook/plugin.go @@ -15,6 +15,7 @@ package webhook import ( + "github.com/blinklabs-io/snek/internal/logging" "github.com/blinklabs-io/snek/plugin" ) @@ -68,6 +69,9 @@ func init() { func NewFromCmdlineOptions() plugin.Plugin { p := New( + WithLogger( + logging.GetLogger().With("plugin", "output.webhook"), + ), WithUrl(cmdlineOptions.url), WithBasicAuth(cmdlineOptions.username, cmdlineOptions.password), WithFormat(cmdlineOptions.format), diff --git a/output/webhook/webhook.go b/output/webhook/webhook.go index fd3f5dd..88fdbde 100644 --- a/output/webhook/webhook.go +++ b/output/webhook/webhook.go @@ -31,6 +31,7 @@ import ( "github.com/blinklabs-io/snek/input/chainsync" "github.com/blinklabs-io/snek/internal/logging" "github.com/blinklabs-io/snek/internal/version" + "github.com/blinklabs-io/snek/plugin" ) const ( @@ -42,6 +43,7 @@ const ( type WebhookOutput struct { errorChan chan error eventChan chan event.Event + logger plugin.Logger format string url string username string diff --git a/plugin/log.go b/plugin/log.go new file mode 100644 index 0000000..a679573 --- /dev/null +++ b/plugin/log.go @@ -0,0 +1,10 @@ +package plugin + +// Logger provides a logging interface for plugins. This happens to match the interface of uber-go/zap +type Logger interface { + Infof(string, ...any) + Warnf(string, ...any) + Debugf(string, ...any) + Errorf(string, ...any) + Fatalf(string, ...any) +}