Skip to content

Commit 4604e48

Browse files
authored
chore: switch to slog for logging (#253)
1 parent 82c08a7 commit 4604e48

File tree

10 files changed

+107
-121
lines changed

10 files changed

+107
-121
lines changed

cmd/adder/main.go

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,22 +86,14 @@ func main() {
8686
// Configure logging
8787
logging.Configure()
8888
logger := logging.GetLogger()
89-
// Sync logger on exit
90-
defer func() {
91-
if err := logger.Sync(); err != nil {
92-
// We don't actually care about the error here, but we have to do something
93-
// to appease the linter
94-
return
95-
}
96-
}()
9789

9890
// Start debug listener
9991
if cfg.Debug.ListenPort > 0 {
100-
logger.Infof(
92+
logger.Info(fmt.Sprintf(
10193
"starting debug listener on %s:%d",
10294
cfg.Debug.ListenAddress,
10395
cfg.Debug.ListenPort,
104-
)
96+
))
10597
go func() {
10698
err := http.ListenAndServe(
10799
fmt.Sprintf(
@@ -112,7 +104,8 @@ func main() {
112104
nil,
113105
)
114106
if err != nil {
115-
logger.Fatalf("failed to start debug listener: %s", err)
107+
logger.Error(fmt.Sprintf("failed to start debug listener: %s", err))
108+
os.Exit(1)
116109
}
117110
}()
118111
}
@@ -129,7 +122,8 @@ func main() {
129122
// Configure input
130123
input := plugin.GetPlugin(plugin.PluginTypeInput, cfg.Input)
131124
if input == nil {
132-
logger.Fatalf("unknown input: %s", cfg.Input)
125+
logger.Error(fmt.Sprintf("unknown input: %s", cfg.Input))
126+
os.Exit(1)
133127
}
134128
pipe.AddInput(input)
135129

@@ -142,7 +136,8 @@ func main() {
142136
// Configure output
143137
output := plugin.GetPlugin(plugin.PluginTypeOutput, cfg.Output)
144138
if output == nil {
145-
logger.Fatalf("unknown output: %s", cfg.Output)
139+
logger.Error(fmt.Sprintf("unknown output: %s", cfg.Output))
140+
os.Exit(1)
146141
}
147142
// Check if output plugin implements APIRouteRegistrar
148143
if registrar, ok := interface{}(output).(api.APIRouteRegistrar); ok {
@@ -152,15 +147,18 @@ func main() {
152147

153148
// Start API after plugins are configured
154149
if err := apiInstance.Start(); err != nil {
155-
logger.Fatalf("failed to start API: %s", err)
150+
logger.Error(fmt.Sprintf("failed to start API: %s", err))
151+
os.Exit(1)
156152
}
157153

158154
// Start pipeline and wait for error
159155
if err := pipe.Start(); err != nil {
160-
logger.Fatalf("failed to start pipeline: %s", err)
156+
logger.Error(fmt.Sprintf("failed to start pipeline: %s", err))
157+
os.Exit(1)
161158
}
162159
err, ok := <-pipe.ErrorChan()
163160
if ok {
164-
logger.Fatalf("pipeline failed: %s", err)
161+
logger.Error(fmt.Sprintf("pipeline failed: %s", err))
162+
os.Exit(1)
165163
}
166164
}

fcm/message.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
"io"
99
"net/http"
10+
"os"
1011

1112
"github.com/blinklabs-io/adder/internal/logging"
1213
)
@@ -45,7 +46,8 @@ func WithNotification(title string, body string) MessageOption {
4546

4647
func NewMessage(token string, opts ...MessageOption) *Message {
4748
if token == "" {
48-
logging.GetLogger().Fatalf("Token is mandatory for FCM message")
49+
logging.GetLogger().Error("Token is mandatory for FCM message")
50+
os.Exit(1)
4951
}
5052

5153
msg := &Message{

go.mod

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ require (
1414
github.com/swaggo/gin-swagger v1.6.0
1515
github.com/swaggo/swag v1.16.3
1616
go.uber.org/automaxprocs v1.5.3
17-
go.uber.org/zap v1.27.0
1817
golang.org/x/oauth2 v0.23.0
1918
gopkg.in/yaml.v2 v2.4.0
2019
)
@@ -62,7 +61,6 @@ require (
6261
github.com/ugorji/go/codec v1.2.12 // indirect
6362
github.com/utxorpc/go-codegen v0.9.0 // indirect
6463
github.com/x448/float16 v0.8.4 // indirect
65-
go.uber.org/multierr v1.10.0 // indirect
6664
golang.org/x/arch v0.8.0 // indirect
6765
golang.org/x/crypto v0.27.0 // indirect
6866
golang.org/x/net v0.25.0 // indirect

go.sum

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,6 @@ go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
145145
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
146146
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
147147
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
148-
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
149-
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
150-
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
151-
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
152148
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
153149
golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
154150
golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=

input/chainsync/chainsync.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ func (c *ChainSync) setupConnection() error {
216216
return err
217217
}
218218
if c.logger != nil {
219-
c.logger.Infof("connected to node at %s", c.dialAddress)
219+
c.logger.Info(fmt.Sprintf("connected to node at %s", c.dialAddress))
220220
}
221221
// Start async error handler
222222
go func() {
@@ -225,18 +225,18 @@ func (c *ChainSync) setupConnection() error {
225225
if c.autoReconnect {
226226
c.autoReconnectDelay = 0
227227
if c.logger != nil {
228-
c.logger.Infof(
228+
c.logger.Info(fmt.Sprintf(
229229
"reconnecting to %s due to error: %s",
230230
c.dialAddress,
231231
err,
232-
)
232+
))
233233
}
234234
for {
235235
if c.autoReconnectDelay > 0 {
236-
c.logger.Infof(
236+
c.logger.Info(fmt.Sprintf(
237237
"waiting %s to reconnect",
238238
c.autoReconnectDelay,
239-
)
239+
))
240240
time.Sleep(c.autoReconnectDelay)
241241
// Double current reconnect delay up to maximum
242242
c.autoReconnectDelay = min(
@@ -250,10 +250,10 @@ func (c *ChainSync) setupConnection() error {
250250
// Shutdown current connection
251251
if err := c.oConn.Close(); err != nil {
252252
if c.logger != nil {
253-
c.logger.Warnf(
253+
c.logger.Warn(fmt.Sprintf(
254254
"failed to properly close connection: %s",
255255
err,
256-
)
256+
))
257257
}
258258
}
259259
// Set the intersect points from the cursor cache
@@ -263,11 +263,11 @@ func (c *ChainSync) setupConnection() error {
263263
// Restart the connection
264264
if err := c.Start(); err != nil {
265265
if c.logger != nil {
266-
c.logger.Infof(
266+
c.logger.Info(fmt.Sprintf(
267267
"reconnecting to %s due to error: %s",
268268
c.dialAddress,
269269
err,
270-
)
270+
))
271271
}
272272
continue
273273
}

internal/logging/logging.go

Lines changed: 31 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -15,59 +15,49 @@
1515
package logging
1616

1717
import (
18-
"log"
18+
"log/slog"
19+
"os"
1920
"time"
2021

2122
"github.com/blinklabs-io/adder/internal/config"
22-
23-
"go.uber.org/zap"
24-
"go.uber.org/zap/zapcore"
2523
)
2624

27-
type Logger = zap.SugaredLogger
28-
29-
var globalLogger *Logger
25+
var globalLogger *slog.Logger
3026

3127
func Configure() {
3228
cfg := config.GetConfig()
33-
// Build our custom logging config
34-
loggerConfig := zap.NewProductionConfig()
35-
// Change timestamp key name
36-
loggerConfig.EncoderConfig.TimeKey = "timestamp"
37-
// Use a human readable time format
38-
loggerConfig.EncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout(
39-
time.RFC3339,
40-
)
41-
42-
// Set level
43-
if cfg.Logging.Level != "" {
44-
level, err := zapcore.ParseLevel(cfg.Logging.Level)
45-
if err != nil {
46-
log.Fatalf("error configuring logger: %s", err)
47-
}
48-
loggerConfig.Level.SetLevel(level)
29+
var level slog.Level
30+
switch cfg.Logging.Level {
31+
case "debug":
32+
level = slog.LevelDebug
33+
case "info":
34+
level = slog.LevelInfo
35+
case "warn":
36+
level = slog.LevelWarn
37+
case "error":
38+
level = slog.LevelError
39+
default:
40+
level = slog.LevelInfo
4941
}
5042

51-
// Create the logger
52-
l, err := loggerConfig.Build()
53-
if err != nil {
54-
log.Fatal(err)
55-
}
43+
handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
44+
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
45+
if a.Key == slog.TimeKey {
46+
// Format the time attribute to use RFC3339 or your custom format
47+
// Rename the time key to timestamp
48+
return slog.String("timestamp", a.Value.Time().Format(time.RFC3339))
49+
}
50+
return a
51+
},
52+
Level: level,
53+
})
54+
globalLogger = slog.New(handler).With("component", "main")
5655

57-
// Store the "sugared" version of the logger
58-
globalLogger = l.Sugar()
5956
}
6057

61-
func GetLogger() *zap.SugaredLogger {
58+
func GetLogger() *slog.Logger {
59+
if globalLogger == nil {
60+
Configure()
61+
}
6262
return globalLogger
6363
}
64-
65-
func GetDesugaredLogger() *zap.Logger {
66-
return globalLogger.Desugar()
67-
}
68-
69-
func GetAccessLogger() *zap.Logger {
70-
return globalLogger.Desugar().
71-
With(zap.String("type", "access")).
72-
WithOptions(zap.WithCaller(false))
73-
}

output/log/log.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
package log
1616

1717
import (
18+
"log/slog"
19+
1820
"github.com/blinklabs-io/adder/event"
1921
"github.com/blinklabs-io/adder/internal/logging"
2022
"github.com/blinklabs-io/adder/plugin"
@@ -24,7 +26,7 @@ type LogOutput struct {
2426
errorChan chan error
2527
eventChan chan event.Event
2628
logger plugin.Logger
27-
outputLogger *logging.Logger
29+
outputLogger *slog.Logger
2830
level string
2931
}
3032

@@ -40,16 +42,13 @@ func New(options ...LogOptionFunc) *LogOutput {
4042
if l.logger == nil {
4143
l.logger = logging.GetLogger()
4244
}
43-
// Determine if we can use the provided logger or need our own
44-
// This is necessary because this plugin uses logger functions that aren't part
45-
// of the plugin.Logger interface
46-
switch v := l.logger.(type) {
47-
case *logging.Logger:
48-
l.outputLogger = v
49-
default:
50-
l.outputLogger = logging.GetLogger()
45+
46+
// Use the provided *slog.Logger if available, otherwise fall back to global logger
47+
if providedLogger, ok := l.logger.(*slog.Logger); ok {
48+
l.outputLogger = providedLogger.With("type", "event")
49+
} else {
50+
l.outputLogger = logging.GetLogger().With("type", "event")
5151
}
52-
l.outputLogger = l.outputLogger.With("type", "event")
5352
return l
5453
}
5554

@@ -64,14 +63,14 @@ func (l *LogOutput) Start() error {
6463
}
6564
switch l.level {
6665
case "info":
67-
l.outputLogger.Infow("", "event", evt)
66+
l.outputLogger.Info("", "event", evt)
6867
case "warn":
69-
l.outputLogger.Warnw("", "event", evt)
68+
l.outputLogger.Warn("", "event", evt)
7069
case "error":
71-
l.outputLogger.Errorw("", "event", evt)
70+
l.outputLogger.Error("", "event", evt)
7271
default:
7372
// Use INFO level if log level isn't recognized
74-
l.outputLogger.Infow("", "event", evt)
73+
l.outputLogger.Info("", "event", evt)
7574
}
7675
}
7776
}()

0 commit comments

Comments
 (0)