Skip to content

Commit bc8109f

Browse files
authored
refactor: replace zap log with slog (#150)
* refactor: replace zap log with slog * fix
1 parent 5c98073 commit bc8109f

File tree

10 files changed

+55
-79
lines changed

10 files changed

+55
-79
lines changed

api/api.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ package api
33
import (
44
"errors"
55
"fmt"
6+
"log/slog"
67
"net/http"
78
"strings"
89
"time"
910

1011
"github.com/0x2e/fusion/auth"
1112
"github.com/0x2e/fusion/conf"
1213
"github.com/0x2e/fusion/frontend"
13-
"github.com/0x2e/fusion/pkg/logx"
1414
"github.com/0x2e/fusion/repo"
1515
"github.com/0x2e/fusion/server"
1616

@@ -35,15 +35,14 @@ type Params struct {
3535

3636
func Run(params Params) {
3737
r := echo.New()
38-
apiLogger := logx.Logger.With("module", "api")
3938

4039
if conf.Debug {
4140
r.Debug = true
4241
r.Use(middleware.BodyDump(func(c echo.Context, reqBody, resBody []byte) {
4342
if len(resBody) > 500 {
4443
resBody = append(resBody[:500], []byte("...")...)
4544
}
46-
apiLogger.Debugw("body dump", "req", reqBody, "resp", resBody)
45+
slog.Debug("body dump", "req", reqBody, "resp", resBody)
4746
}))
4847
}
4948

@@ -61,9 +60,9 @@ func Run(params Params) {
6160
return nil
6261
}
6362
if v.Error == nil {
64-
apiLogger.Infow("REQUEST", "uri", v.URI, "status", v.Status)
63+
slog.Info("REQUEST", "uri", v.URI, "status", v.Status)
6564
} else {
66-
apiLogger.Errorw(v.Error.Error(), "uri", v.URI, "status", v.Status)
65+
slog.Error(v.Error.Error(), "uri", v.URI, "status", v.Status)
6766
}
6867
return nil
6968
},
@@ -144,7 +143,8 @@ func Run(params Params) {
144143
err = r.Start(addr)
145144
}
146145
if err != nil {
147-
apiLogger.Fatalln(err)
146+
slog.Error(err.Error())
147+
return
148148
}
149149
}
150150

cmd/server/server.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,42 @@
11
package main
22

33
import (
4-
"log"
54
"net/http"
65
_ "net/http/pprof"
6+
"os"
7+
8+
"log/slog"
79

810
"github.com/0x2e/fusion/api"
911
"github.com/0x2e/fusion/conf"
10-
"github.com/0x2e/fusion/pkg/logx"
1112
"github.com/0x2e/fusion/repo"
1213
"github.com/0x2e/fusion/service/pull"
1314
)
1415

1516
func main() {
16-
defer logx.Logger.Sync()
17+
l := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
18+
Level: slog.LevelInfo,
19+
}))
20+
slog.SetDefault(l)
1721

1822
if conf.Debug {
23+
l := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
24+
Level: slog.LevelDebug,
25+
}))
26+
slog.SetDefault(l)
27+
1928
go func() {
20-
logx.Logger.Infoln(http.ListenAndServe("localhost:6060", nil))
29+
if err := http.ListenAndServe("localhost:6060", nil); err != nil {
30+
slog.Error("pprof server", "error", err)
31+
return
32+
}
2133
}()
2234
}
2335

2436
config, err := conf.Load()
2537
if err != nil {
26-
log.Fatalf("failed to load configuration: %v", err)
38+
slog.Error("failed to load configuration", "error", err)
39+
return
2740
}
2841
repo.Init(config.DB)
2942

conf/conf.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package conf
33
import (
44
"errors"
55
"fmt"
6-
"log"
6+
"log/slog"
77
"os"
88

99
"github.com/0x2e/fusion/auth"
@@ -32,9 +32,9 @@ func Load() (Conf, error) {
3232
if !os.IsNotExist(err) {
3333
return Conf{}, err
3434
}
35-
log.Printf("no configuration file found at %s", dotEnvFilename)
35+
slog.Warn(fmt.Sprintf("no configuration file found at %s", dotEnvFilename))
3636
} else {
37-
log.Printf("read configuration from %s", dotEnvFilename)
37+
slog.Info(fmt.Sprintf("load configuration from %s", dotEnvFilename))
3838
}
3939
var conf struct {
4040
Host string `env:"HOST" envDefault:"0.0.0.0"`
@@ -46,11 +46,9 @@ func Load() (Conf, error) {
4646
TLSKey string `env:"TLS_KEY"`
4747
}
4848
if err := env.Parse(&conf); err != nil {
49-
panic(err)
50-
}
51-
if Debug {
52-
fmt.Println(conf)
49+
return Conf{}, err
5350
}
51+
slog.Debug("configuration loaded", "conf", conf)
5452

5553
var pwHash *auth.HashedPassword
5654
if conf.Password != "" {

go.mod

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ require (
1515
github.com/labstack/echo/v4 v4.13.3
1616
github.com/mmcdole/gofeed v1.3.0
1717
github.com/stretchr/testify v1.10.0
18-
go.uber.org/zap v1.27.0
1918
golang.org/x/crypto v0.37.0
2019
gorm.io/gorm v1.25.12
2120
gorm.io/plugin/soft_delete v1.2.1
@@ -47,7 +46,6 @@ require (
4746
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
4847
github.com/valyala/bytebufferpool v1.0.0 // indirect
4948
github.com/valyala/fasttemplate v1.2.2 // indirect
50-
go.uber.org/multierr v1.11.0 // indirect
5149
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
5250
golang.org/x/net v0.39.0 // indirect
5351
golang.org/x/sys v0.32.0 // indirect

go.sum

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,6 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC
9999
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
100100
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
101101
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
102-
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
103-
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
104-
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
105-
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
106-
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
107-
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
108102
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
109103
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
110104
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=

pkg/logx/logx.go

Lines changed: 0 additions & 39 deletions
This file was deleted.

pkg/ptr/ptr.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,13 @@ package ptr
44
func To[T any](v T) *T {
55
return &v
66
}
7+
8+
// From returns the value pointed to by the given pointer.
9+
// If the pointer is nil, it returns the zero value of the type.
10+
func From[T any](v *T) T {
11+
if v == nil {
12+
var zero T
13+
return zero
14+
}
15+
return *v
16+
}

service/pull/handle.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,29 @@ package pull
22

33
import (
44
"context"
5+
"fmt"
6+
"log/slog"
57
"time"
68

79
"github.com/0x2e/fusion/model"
10+
"github.com/0x2e/fusion/pkg/ptr"
811
"github.com/0x2e/fusion/service/pull/client"
912
)
1013

1114
func (p *Puller) do(ctx context.Context, f *model.Feed, force bool) error {
12-
logger := pullLogger.With("feed_id", f.ID, "feed_name", f.Name)
15+
logger := slog.With("feed_id", f.ID, "feed_link", ptr.From(f.Link))
1316
ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
1417
defer cancel()
1518

1619
updateAction, skipReason := DecideFeedUpdateAction(f, time.Now())
1720
if skipReason == &SkipReasonSuspended {
18-
logger.Infof("skip: %s", skipReason)
21+
logger.Info(fmt.Sprintf("skip: %s", skipReason))
1922
return nil
2023
}
2124
if !force {
2225
switch updateAction {
2326
case ActionSkipUpdate:
24-
logger.Infof("skip: %s", skipReason)
27+
logger.Info(fmt.Sprintf("skip: %s", skipReason))
2528
return nil
2629
case ActionFetchUpdate:
2730
// Proceed to perform the fetch.
@@ -69,8 +72,7 @@ func DecideFeedUpdateAction(f *model.Feed, now time.Time) (FeedUpdateAction, *Fe
6972
backoffTime := CalculateBackoffTime(f.ConsecutiveFailures)
7073
timeSinceUpdate := now.Sub(f.UpdatedAt)
7174
if timeSinceUpdate < backoffTime {
72-
logger := pullLogger.With("feed_id", f.ID, "feed_name", f.Name)
73-
logger.Infof("%d consecutive feed update failures, so next attempt is after %v", f.ConsecutiveFailures, f.UpdatedAt.Add(backoffTime).Format(time.RFC3339))
75+
slog.Info(fmt.Sprintf("%d consecutive feed update failures, so next attempt is after %v", f.ConsecutiveFailures, f.UpdatedAt.Add(backoffTime).Format(time.RFC3339)), "feed_id", f.ID, "feed_link", ptr.From(f.Link))
7476
return ActionSkipUpdate, &SkipReasonCoolingOff
7577
}
7678
} else if now.Sub(f.UpdatedAt) < interval {

service/pull/pull.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ package pull
33
import (
44
"context"
55
"errors"
6+
"log/slog"
67
"sync"
78
"time"
89

910
"github.com/0x2e/fusion/model"
10-
"github.com/0x2e/fusion/pkg/logx"
11+
"github.com/0x2e/fusion/pkg/ptr"
1112
"github.com/0x2e/fusion/repo"
1213
)
1314

1415
var (
15-
interval = 30 * time.Minute
16-
pullLogger = logx.Logger.With("module", "puller")
16+
interval = 30 * time.Minute
1717
)
1818

1919
type FeedRepo interface {
@@ -52,7 +52,6 @@ func (p *Puller) Run() {
5252
}
5353

5454
func (p *Puller) PullAll(ctx context.Context, force bool) error {
55-
logger := logx.LoggerFromContext(ctx)
5655
ctx, cancel := context.WithTimeout(ctx, interval/2)
5756
defer cancel()
5857

@@ -80,8 +79,7 @@ func (p *Puller) PullAll(ctx context.Context, force bool) error {
8079
}()
8180

8281
if err := p.do(ctx, f, force); err != nil {
83-
logger := logger.With("feed_id", f.ID)
84-
logger.Errorln(err)
82+
slog.Error("failed to pull feed", "error", err, "feed_id", f.ID, "feed_link", ptr.From(f.Link))
8583
}
8684
}(f)
8785
}

service/pull/singlefeed.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package pull
22

33
import (
44
"context"
5+
"fmt"
6+
"log/slog"
57
"time"
68

79
"github.com/0x2e/fusion/model"
@@ -76,14 +78,14 @@ func (r *defaultSingleFeedRepo) RecordFailure(readErr error) error {
7678
}
7779

7880
func (p SingleFeedPuller) Pull(ctx context.Context, feed *model.Feed) error {
79-
logger := pullLogger.With("feed_id", feed.ID, "feed_name", feed.Name)
81+
logger := slog.With("feed_id", feed.ID, "feed_link", ptr.From(feed.Link))
8082

8183
// We don't exit on error, as we want to record any error in the data store.
8284
fetchResult, readErr := p.readFeed(ctx, *feed.Link, feed.FeedRequestOptions)
8385
if readErr == nil {
84-
logger.Infof("fetched %d items", len(fetchResult.Items))
86+
logger.Info(fmt.Sprintf("fetched %d items", len(fetchResult.Items)))
8587
} else {
86-
logger.Infof("fetch failed: %v", readErr)
88+
logger.Warn("failed to fetch feed", "error", readErr)
8789
}
8890

8991
return p.updateFeedInStore(feed.ID, fetchResult.Items, fetchResult.LastBuild, readErr)

0 commit comments

Comments
 (0)