Skip to content

Commit 170111b

Browse files
committed
add zap logger
1 parent 8d197d5 commit 170111b

File tree

5 files changed

+91
-6
lines changed

5 files changed

+91
-6
lines changed

cmd/api/main.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,35 @@ import (
77
"sandbox-go-api-sqlboiler-rest-auth/internal/config"
88
"sandbox-go-api-sqlboiler-rest-auth/internal/routes"
99

10+
"go.uber.org/zap"
11+
1012
_ "github.com/lib/pq"
1113
)
1214

1315
func main() {
16+
// config
1417
cfg, err := config.NewConfig()
1518
if err != nil {
1619
log.Fatalln(err)
1720
return
1821
}
22+
23+
// logger
24+
logger, _ := zap.NewDevelopment()
25+
defer func() {
26+
_ = logger.Sync()
27+
}()
28+
29+
// db
1930
connStr := "host=localhost port=5433 dbname=sandbox user=postgres password=postgres sslmode=disable"
2031
db, err := sql.Open("postgres", connStr)
2132
if err != nil {
2233
log.Fatalln("cannot open the database")
2334
}
24-
defer db.Close()
35+
defer func() {
36+
_ = db.Close()
37+
}()
2538

26-
e := routes.NewRouter(db)
39+
e := routes.NewRouter(db, logger)
2740
e.Logger.Fatal(e.Start(fmt.Sprintf(":%s", cfg.Port)))
2841
}

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
github.com/volatiletech/randomize v0.0.1
1313
github.com/volatiletech/sqlboiler/v4 v4.6.0
1414
github.com/volatiletech/strmangle v0.0.1
15+
go.uber.org/zap v1.19.1
1516
)
1617

1718
require (
@@ -33,6 +34,8 @@ require (
3334
github.com/valyala/bytebufferpool v1.0.0 // indirect
3435
github.com/valyala/fasttemplate v1.2.1 // indirect
3536
github.com/volatiletech/inflect v0.0.1 // indirect
37+
go.uber.org/atomic v1.7.0 // indirect
38+
go.uber.org/multierr v1.6.0 // indirect
3639
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf // indirect
3740
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect
3841
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
5050
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
5151
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
5252
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
53+
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
54+
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
5355
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
5456
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
5557
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
@@ -272,6 +274,7 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9
272274
github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
273275
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
274276
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
277+
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
275278
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
276279
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
277280
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -366,11 +369,17 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
366369
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
367370
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
368371
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
372+
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
369373
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
374+
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4=
375+
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
370376
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
377+
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
371378
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
372379
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
373380
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
381+
go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=
382+
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
374383
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
375384
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
376385
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -596,6 +605,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f
596605
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
597606
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
598607
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
608+
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
599609
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
600610
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
601611
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/routes/middlewares.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package routes
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
"go.uber.org/zap"
8+
"go.uber.org/zap/zapcore"
9+
10+
"github.com/labstack/echo/v4"
11+
)
12+
13+
func ZapLogger(log *zap.Logger) echo.MiddlewareFunc {
14+
return func(next echo.HandlerFunc) echo.HandlerFunc {
15+
return func(c echo.Context) error {
16+
start := time.Now()
17+
18+
err := next(c)
19+
if err != nil {
20+
c.Error(err)
21+
}
22+
23+
req := c.Request()
24+
res := c.Response()
25+
26+
fields := []zapcore.Field{
27+
zap.Int("status", res.Status),
28+
zap.String("request", fmt.Sprintf("%s %s", req.Method, req.RequestURI)),
29+
zap.String("remote_ip", c.RealIP()),
30+
zap.String("latency", time.Since(start).String()),
31+
zap.String("host", req.Host),
32+
zap.Int64("size", res.Size),
33+
zap.String("user_agent", req.UserAgent()),
34+
}
35+
36+
id := req.Header.Get(echo.HeaderXRequestID)
37+
if id == "" {
38+
id = res.Header().Get(echo.HeaderXRequestID)
39+
fields = append(fields, zap.String("request_id", id))
40+
}
41+
42+
n := res.Status
43+
switch {
44+
case n >= 500:
45+
log.With(zap.Error(err)).Error("Server error", fields...)
46+
case n >= 400:
47+
log.With(zap.Error(err)).Warn("Client error", fields...)
48+
case n >= 300:
49+
log.Info("Redirection", fields...)
50+
default:
51+
log.Info("Success", fields...)
52+
}
53+
54+
return nil
55+
}
56+
}
57+
}

internal/routes/routes.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@ import (
77
"log"
88
"sandbox-go-api-sqlboiler-rest-auth/internal/handlers"
99

10+
"go.uber.org/zap"
11+
1012
"github.com/labstack/echo/v4/middleware"
1113

1214
"github.com/labstack/echo/v4"
1315
)
1416

15-
func NewRouter(db *sql.DB) *echo.Echo {
17+
func NewRouter(db *sql.DB, logger *zap.Logger) *echo.Echo {
1618
e := echo.New()
17-
bindRouteMiddlewares(e)
19+
bindRouteMiddlewares(e, logger)
1820
// routes
1921
e.GET("/api/status", handlers.GetStatus)
2022

@@ -33,10 +35,10 @@ func exportRoutesJson(e *echo.Echo) {
3335
}
3436
}
3537

36-
func bindRouteMiddlewares(e *echo.Echo) {
38+
func bindRouteMiddlewares(e *echo.Echo, logger *zap.Logger) {
3739
// middlewares
3840
e.Pre(middleware.RemoveTrailingSlash())
39-
e.Use(middleware.Logger())
41+
e.Use(ZapLogger(logger))
4042
e.Use(middleware.RateLimiter(middleware.NewRateLimiterMemoryStore(20)))
4143
e.Use(middleware.SecureWithConfig(middleware.SecureConfig{}))
4244
e.Use(middleware.TimeoutWithConfig(middleware.TimeoutConfig{}))

0 commit comments

Comments
 (0)