Skip to content

Commit b4d796c

Browse files
authored
chore: switch to slog for logging (#182)
Fixes #177
1 parent 888411e commit b4d796c

File tree

7 files changed

+239
-179
lines changed

7 files changed

+239
-179
lines changed

cmd/cdnsd/main.go

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package main
99
import (
1010
"flag"
1111
"fmt"
12+
"log/slog"
1213
"net/http"
1314
_ "net/http/pprof"
1415
"os"
@@ -18,7 +19,6 @@ import (
1819
"github.com/blinklabs-io/cdnsd/internal/config"
1920
"github.com/blinklabs-io/cdnsd/internal/dns"
2021
"github.com/blinklabs-io/cdnsd/internal/indexer"
21-
"github.com/blinklabs-io/cdnsd/internal/logging"
2222
"github.com/blinklabs-io/cdnsd/internal/state"
2323
"github.com/blinklabs-io/cdnsd/internal/version"
2424
)
@@ -43,33 +43,38 @@ func main() {
4343
os.Exit(1)
4444
}
4545

46-
// Configure logging
47-
logging.Setup()
48-
logger := logging.GetLogger()
49-
// Sync logger on exit
50-
defer func() {
51-
if err := logger.Sync(); err != nil {
52-
// We don't actually care about the error here, but we have to do something
53-
// to appease the linter
54-
return
55-
}
56-
}()
46+
// Configure logger
47+
logLevel := slog.LevelInfo
48+
if cfg.Logging.Debug {
49+
logLevel = slog.LevelDebug
50+
}
51+
logger := slog.New(
52+
slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
53+
Level: logLevel,
54+
}),
55+
)
56+
slog.SetDefault(logger)
5757

58-
logger.Info(
58+
slog.Info(
5959
fmt.Sprintf("cdnsd %s started", version.GetVersionString()),
6060
)
6161

6262
// Load state
6363
if err := state.GetState().Load(); err != nil {
64-
logger.Fatalf("failed to load state: %s", err)
64+
slog.Error(
65+
fmt.Sprintf("failed to load state: %s", err),
66+
)
67+
os.Exit(1)
6568
}
6669

6770
// Start debug listener
6871
if cfg.Debug.ListenPort > 0 {
69-
logger.Infof(
70-
"starting debug listener on %s:%d",
71-
cfg.Debug.ListenAddress,
72-
cfg.Debug.ListenPort,
72+
slog.Info(
73+
fmt.Sprintf(
74+
"starting debug listener on %s:%d",
75+
cfg.Debug.ListenAddress,
76+
cfg.Debug.ListenPort,
77+
),
7378
)
7479
go func() {
7580
err := http.ListenAndServe(
@@ -81,24 +86,35 @@ func main() {
8186
nil,
8287
)
8388
if err != nil {
84-
logger.Fatalf("failed to start debug listener: %s", err)
89+
slog.Error(
90+
fmt.Sprintf("failed to start debug listener: %s", err),
91+
)
92+
os.Exit(1)
8593
}
8694
}()
8795
}
8896

8997
// Start indexer
9098
if err := indexer.GetIndexer().Start(); err != nil {
91-
logger.Fatalf("failed to start indexer: %s", err)
99+
slog.Error(
100+
fmt.Sprintf("failed to start indexer: %s", err),
101+
)
102+
os.Exit(1)
92103
}
93104

94105
// Start DNS listener
95-
logger.Infof(
96-
"starting DNS listener on %s:%d",
97-
cfg.Dns.ListenAddress,
98-
cfg.Dns.ListenPort,
106+
slog.Info(
107+
fmt.Sprintf(
108+
"starting DNS listener on %s:%d",
109+
cfg.Dns.ListenAddress,
110+
cfg.Dns.ListenPort,
111+
),
99112
)
100113
if err := dns.Start(); err != nil {
101-
logger.Fatalf("failed to start DNS listener: %s", err)
114+
slog.Error(
115+
fmt.Sprintf("failed to start DNS listener: %s", err),
116+
)
117+
os.Exit(1)
102118
}
103119

104120
// Wait forever

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ require (
1010
github.com/kelseyhightower/envconfig v1.4.0
1111
github.com/miekg/dns v1.1.61
1212
go.uber.org/automaxprocs v1.5.3
13-
go.uber.org/zap v1.27.0
1413
gopkg.in/yaml.v2 v2.4.0
1514
)
1615

@@ -40,6 +39,7 @@ require (
4039
github.com/x448/float16 v0.8.4 // indirect
4140
go.opencensus.io v0.22.5 // indirect
4241
go.uber.org/multierr v1.10.0 // indirect
42+
go.uber.org/zap v1.27.0 // indirect
4343
golang.org/x/crypto v0.25.0 // indirect
4444
golang.org/x/mod v0.18.0 // indirect
4545
golang.org/x/net v0.26.0 // indirect

internal/config/config.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ type Config struct {
2626
}
2727

2828
type LoggingConfig struct {
29-
Healthchecks bool `yaml:"healthchecks" envconfig:"LOGGING_HEALTHCHECKS"`
30-
Level string `yaml:"level" envconfig:"LOGGING_LEVEL"`
31-
QueryLog bool `yaml:"queryLog" envconfig:"LOGGING_QUERY_LOG"`
29+
Debug bool `yaml:"debug" envconfig:"LOGGING_DEBUG"`
30+
QueryLog bool `yaml:"queryLog" envconfig:"LOGGING_QUERY_LOG"`
3231
}
3332

3433
type DnsConfig struct {
@@ -65,9 +64,7 @@ type StateConfig struct {
6564
// Singleton config instance with default values
6665
var globalConfig = &Config{
6766
Logging: LoggingConfig{
68-
Level: "info",
69-
Healthchecks: false,
70-
QueryLog: true,
67+
QueryLog: true,
7168
},
7269
Dns: DnsConfig{
7370
ListenAddress: "",

internal/dns/dns.go

Lines changed: 66 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ package dns
88

99
import (
1010
"fmt"
11+
"log/slog"
1112
"math/rand"
1213
"net"
14+
"os"
1315
"strings"
1416

1517
"github.com/blinklabs-io/cdnsd/internal/config"
16-
"github.com/blinklabs-io/cdnsd/internal/logging"
1718
"github.com/blinklabs-io/cdnsd/internal/state"
1819

1920
"github.com/miekg/dns"
@@ -49,21 +50,25 @@ func Start() error {
4950

5051
func startListener(server *dns.Server) {
5152
if err := server.ListenAndServe(); err != nil {
52-
logging.GetLogger().Fatalf("failed to start DNS listener: %s", err)
53+
slog.Error(
54+
fmt.Sprintf("failed to start DNS listener: %s", err),
55+
)
56+
os.Exit(1)
5357
}
5458
}
5559

5660
func handleQuery(w dns.ResponseWriter, r *dns.Msg) {
57-
logger := logging.GetLogger()
5861
cfg := config.GetConfig()
5962
m := new(dns.Msg)
6063

6164
if cfg.Logging.QueryLog {
6265
for _, q := range r.Question {
63-
logger.Infof("query: name: %s, type: %s, class: %s",
64-
q.Name,
65-
dns.Type(q.Qtype).String(),
66-
dns.Class(q.Qclass).String(),
66+
slog.Info(
67+
fmt.Sprintf("query: name: %s, type: %s, class: %s",
68+
q.Name,
69+
dns.Type(q.Qtype).String(),
70+
dns.Class(q.Qclass).String(),
71+
),
6772
)
6873
}
6974
}
@@ -74,7 +79,9 @@ func handleQuery(w dns.ResponseWriter, r *dns.Msg) {
7479
strings.TrimSuffix(r.Question[0].Name, "."),
7580
)
7681
if err != nil {
77-
logger.Errorf("failed to lookup records in state: %s", err)
82+
slog.Error(
83+
fmt.Sprintf("failed to lookup records in state: %s", err),
84+
)
7885
return
7986
}
8087
if records != nil {
@@ -83,14 +90,18 @@ func handleQuery(w dns.ResponseWriter, r *dns.Msg) {
8390
for _, tmpRecord := range records {
8491
tmpRR, err := stateRecordToDnsRR(tmpRecord)
8592
if err != nil {
86-
logger.Errorf("failed to convert state record to dns.RR: %s", err)
93+
slog.Error(
94+
fmt.Sprintf("failed to convert state record to dns.RR: %s", err),
95+
)
8796
return
8897
}
8998
m.Answer = append(m.Answer, tmpRR)
9099
}
91100
// Send response
92101
if err := w.WriteMsg(m); err != nil {
93-
logger.Errorf("failed to write response: %s", err)
102+
slog.Error(
103+
fmt.Sprintf("failed to write response: %s", err),
104+
)
94105
}
95106
// We found our answer, to return from handler
96107
return
@@ -101,10 +112,12 @@ func handleQuery(w dns.ResponseWriter, r *dns.Msg) {
101112
r.Question[0].Name,
102113
)
103114
if err != nil {
104-
logger.Errorf(
105-
"failed to lookup nameservers for %s: %s",
106-
r.Question[0].Name,
107-
err,
115+
slog.Error(
116+
fmt.Sprintf(
117+
"failed to lookup nameservers for %s: %s",
118+
r.Question[0].Name,
119+
err,
120+
),
108121
)
109122
}
110123
if nameservers != nil {
@@ -119,15 +132,21 @@ func handleQuery(w dns.ResponseWriter, r *dns.Msg) {
119132
// Send failure response
120133
m.SetRcode(r, dns.RcodeServerFailure)
121134
if err := w.WriteMsg(m); err != nil {
122-
logger.Errorf("failed to write response: %s", err)
135+
slog.Error(
136+
fmt.Sprintf("failed to write response: %s", err),
137+
)
123138
}
124-
logger.Errorf("failed to query domain nameserver: %s", err)
139+
slog.Error(
140+
fmt.Sprintf("failed to query domain nameserver: %s", err),
141+
)
125142
return
126143
} else {
127144
copyResponse(r, resp, m)
128145
// Send response
129146
if err := w.WriteMsg(m); err != nil {
130-
logger.Errorf("failed to write response: %s", err)
147+
slog.Error(
148+
fmt.Sprintf("failed to write response: %s", err),
149+
)
131150
}
132151
return
133152
}
@@ -161,7 +180,9 @@ func handleQuery(w dns.ResponseWriter, r *dns.Msg) {
161180
}
162181
// Send response
163182
if err := w.WriteMsg(m); err != nil {
164-
logger.Errorf("failed to write response: %s", err)
183+
slog.Error(
184+
fmt.Sprintf("failed to write response: %s", err),
185+
)
165186
}
166187
// We found our answer, to return from handler
167188
return
@@ -177,15 +198,21 @@ func handleQuery(w dns.ResponseWriter, r *dns.Msg) {
177198
// Send failure response
178199
m.SetRcode(r, dns.RcodeServerFailure)
179200
if err := w.WriteMsg(m); err != nil {
180-
logger.Errorf("failed to write response: %s", err)
201+
slog.Error(
202+
fmt.Sprintf("failed to write response: %s", err),
203+
)
181204
}
182-
logger.Errorf("failed to query domain nameserver: %s", err)
205+
slog.Error(
206+
fmt.Sprintf("failed to query domain nameserver: %s", err),
207+
)
183208
return
184209
} else {
185210
copyResponse(r, resp, m)
186211
// Send response
187212
if err := w.WriteMsg(m); err != nil {
188-
logger.Errorf("failed to write response: %s", err)
213+
slog.Error(
214+
fmt.Sprintf("failed to write response: %s", err),
215+
)
189216
}
190217
return
191218
}
@@ -194,7 +221,9 @@ func handleQuery(w dns.ResponseWriter, r *dns.Msg) {
194221
// Return NXDOMAIN if we have no information about the requested domain or any of its parents
195222
m.SetRcode(r, dns.RcodeNameError)
196223
if err := w.WriteMsg(m); err != nil {
197-
logger.Errorf("failed to write response: %s", err)
224+
slog.Error(
225+
fmt.Sprintf("failed to write response: %s", err),
226+
)
198227
}
199228
}
200229

@@ -243,7 +272,6 @@ func randomNameserverAddress(nameservers map[string][]net.IP) net.IP {
243272
}
244273

245274
func doQuery(msg *dns.Msg, address string, recursive bool) (*dns.Msg, error) {
246-
logger := logging.GetLogger()
247275
// Default to a random fallback server if no address is specified
248276
if address == "" {
249277
address = randomFallbackServer()
@@ -252,22 +280,26 @@ func doQuery(msg *dns.Msg, address string, recursive bool) (*dns.Msg, error) {
252280
if !strings.Contains(address, ":") {
253281
address = address + `:53`
254282
}
255-
logger.Debugf(
256-
"querying %s: %s",
257-
address,
258-
formatMessageQuestionSection(msg.Question),
283+
slog.Debug(
284+
fmt.Sprintf(
285+
"querying %s: %s",
286+
address,
287+
formatMessageQuestionSection(msg.Question),
288+
),
259289
)
260290
resp, err := dns.Exchange(msg, address)
261291
if err != nil {
262292
return nil, err
263293
}
264-
logger.Debugf(
265-
"response: rcode=%s, authoritative=%v, authority=%s, answer=%s, extra=%s",
266-
dns.RcodeToString[resp.Rcode],
267-
resp.Authoritative,
268-
formatMessageAnswerSection(resp.Ns),
269-
formatMessageAnswerSection(resp.Answer),
270-
formatMessageAnswerSection(resp.Extra),
294+
slog.Debug(
295+
fmt.Sprintf(
296+
"response: rcode=%s, authoritative=%v, authority=%s, answer=%s, extra=%s",
297+
dns.RcodeToString[resp.Rcode],
298+
resp.Authoritative,
299+
formatMessageAnswerSection(resp.Ns),
300+
formatMessageAnswerSection(resp.Answer),
301+
formatMessageAnswerSection(resp.Extra),
302+
),
271303
)
272304
// Immediately return authoritative response
273305
if resp.Authoritative {

0 commit comments

Comments
 (0)