Skip to content

Commit 180fee7

Browse files
committed
feat: Add zap logger and update all logging calls.
1 parent 691ea7d commit 180fee7

File tree

11 files changed

+219
-37
lines changed

11 files changed

+219
-37
lines changed

go.mod

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ require (
77
github.com/rabbitmq/amqp091-go v1.4.0
88
github.com/stretchr/testify v1.7.0
99
github.com/wagslane/go-rabbitmq v0.10.0
10+
go.uber.org/zap v1.21.0
1011
)
1112

1213
require (
13-
github.com/davecgh/go-spew v1.1.0 // indirect
14+
github.com/davecgh/go-spew v1.1.1 // indirect
1415
github.com/pmezard/go-difflib v1.0.0 // indirect
15-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
16+
go.uber.org/atomic v1.7.0 // indirect
17+
go.uber.org/multierr v1.6.0 // indirect
18+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
1619
)

go.sum

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,37 @@
1-
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
1+
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
2+
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
23
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
36
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
47
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
58
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
69
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
710
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
811
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
912
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
13+
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
14+
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
1015
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1116
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1217
github.com/rabbitmq/amqp091-go v1.4.0 h1:T2G+J9W9OY4p64Di23J6yH7tOkMocgnESvYeBjuG9cY=
1318
github.com/rabbitmq/amqp091-go v1.4.0/go.mod h1:JsV0ofX5f1nwOGafb8L5rBItt9GyhfQfcJj+oyz0dGg=
1419
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
20+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
1521
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
1622
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
1723
github.com/wagslane/go-rabbitmq v0.10.0 h1:y9Bw8Q/9gOvsHfjMOGQjCW3033aYTKabxDm8eyjUGjs=
1824
github.com/wagslane/go-rabbitmq v0.10.0/go.mod h1:u6xM1V7OO4D0szUy/F6Bya/9r0lLae/2FXBijkAQmn0=
1925
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
26+
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
27+
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
28+
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
2029
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
2130
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
31+
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
32+
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
33+
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
34+
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
2235
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
2336
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
2437
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -48,5 +61,8 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T
4861
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
4962
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
5063
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
51-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
64+
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
65+
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
5266
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
67+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
68+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/app.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,45 @@ package internal
33
import (
44
"context"
55
"github.com/rog-golang-buddies/api-hub_data-scraping-service/internal/config"
6+
"github.com/rog-golang-buddies/api-hub_data-scraping-service/internal/logger"
67
"github.com/rog-golang-buddies/api-hub_data-scraping-service/internal/queue"
78
"github.com/rog-golang-buddies/api-hub_data-scraping-service/internal/queue/handler"
89
"github.com/rog-golang-buddies/api-hub_data-scraping-service/internal/queue/publisher"
9-
"log"
1010
)
1111

1212
func Start() int {
1313
ctx, cancel := context.WithCancel(context.Background())
1414
defer cancel()
1515

1616
conf := config.ReadConfig() //read configuration from file & env
17+
log, err := logger.NewLogger(&conf)
1718
//initialize publisher connection to the queue
1819
//this library assumes using one publisher and one consumer per application
1920
//https://github.com/wagslane/go-rabbitmq/issues/79
20-
pub, err := publisher.NewPublisher(conf.QueueConfig) //TODO pass logger here and add it to publisher options
21+
pub, err := publisher.NewPublisher(conf.QueueConfig, log)
2122
if err != nil {
22-
log.Println("error while starting publisher: ", err)
23+
log.Error("error while starting publisher: ", err)
2324
return 1
2425
}
25-
defer publisher.ClosePublisher(pub)
26+
defer publisher.ClosePublisher(pub, log)
2627
//initialize consumer connection to the queue
27-
consumer, err := queue.NewConsumer(conf.QueueConfig) //TODO pass logger here and add it to consumer options
28+
consumer, err := queue.NewConsumer(conf.QueueConfig, log)
2829
if err != nil {
29-
log.Println("error while connecting to the queue: ", err)
30+
log.Error("error while connecting to the queue: ", err)
3031
return 1
3132
}
32-
defer queue.CloseConsumer(consumer)
33+
defer queue.CloseConsumer(consumer, log)
3334

34-
handl := handler.NewApiSpecDocHandler(pub, conf.QueueConfig)
35+
handl := handler.NewApiSpecDocHandler(pub, conf.QueueConfig, log)
3536
listener := queue.NewListener()
3637
err = listener.Start(consumer, &conf.QueueConfig, handl)
3738
if err != nil {
38-
log.Println("error while listening queue ", err)
39+
log.Error("error while listening queue ", err)
3940
return 1
4041
}
4142

4243
<-ctx.Done()
4344

44-
log.Println("application stopped gracefully (not)")
45+
log.Info("application stopped gracefully (not)")
4546
return 0
4647
}

internal/config/application.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package config
22

33
type ApplicationConfig struct {
4-
Env Environment
4+
Env Environment `default:"dev"`
55
Logger LoggerConfig
66
QueueConfig QueueConfig
77
}

internal/config/logger.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ package config
22

33
//LoggerConfig represents configuration of the logger
44
type LoggerConfig struct {
5-
Level string //Level of minimum logging
5+
Level LoggerLevel `default:"info"` //Level of minimum logging
66
}

internal/config/types.go

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,38 @@
11
package config
22

3-
type Environment int
3+
import "go.uber.org/zap/zapcore"
4+
5+
type Environment string
6+
7+
const (
8+
Dev Environment = "dev"
9+
Prod Environment = "prod"
10+
)
11+
12+
type LoggerLevel string
413

514
const (
6-
Dev Environment = iota
7-
Prod
15+
TraceLevel LoggerLevel = "trace"
16+
DebugLevel LoggerLevel = "debug"
17+
InfoLevel LoggerLevel = "info"
18+
WarnLevel LoggerLevel = "warn"
19+
ErrorLevel LoggerLevel = "error"
20+
PanicLevel LoggerLevel = "panic"
821
)
22+
23+
func (ll LoggerLevel) ToZapLevel() zapcore.Level {
24+
switch ll {
25+
case TraceLevel, DebugLevel:
26+
return zapcore.DebugLevel
27+
case InfoLevel:
28+
return zapcore.InfoLevel
29+
case WarnLevel:
30+
return zapcore.WarnLevel
31+
case ErrorLevel:
32+
return zapcore.ErrorLevel
33+
case PanicLevel:
34+
return zapcore.PanicLevel
35+
default:
36+
return zapcore.InfoLevel
37+
}
38+
}

internal/logger/logger.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package logger
2+
3+
import (
4+
"github.com/rog-golang-buddies/api-hub_data-scraping-service/internal/config"
5+
)
6+
7+
//Logger represents common logger interface
8+
type Logger interface {
9+
Fatal(args ...interface{})
10+
Fatalf(format string, args ...interface{})
11+
12+
Error(args ...interface{})
13+
Errorf(format string, args ...interface{})
14+
15+
Warn(args ...interface{})
16+
Warnf(format string, args ...interface{})
17+
18+
Info(args ...interface{})
19+
Infof(format string, args ...interface{})
20+
21+
Debug(args ...interface{})
22+
Debugf(format string, args ...interface{})
23+
24+
Trace(args ...interface{})
25+
Tracef(format string, args ...interface{})
26+
}
27+
28+
func NewLogger(conf *config.ApplicationConfig) (Logger, error) {
29+
return newZapLogger(conf)
30+
}

internal/logger/zap.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package logger
2+
3+
import (
4+
"github.com/rog-golang-buddies/api-hub_data-scraping-service/internal/config"
5+
"go.uber.org/zap"
6+
)
7+
8+
type ZapLogger struct {
9+
log *zap.SugaredLogger
10+
level config.LoggerLevel
11+
}
12+
13+
func (l *ZapLogger) Fatal(args ...interface{}) {
14+
l.log.Fatal(args)
15+
}
16+
17+
func (l *ZapLogger) Fatalf(format string, args ...interface{}) {
18+
l.log.Fatalf(format, args)
19+
}
20+
21+
func (l *ZapLogger) Error(args ...interface{}) {
22+
l.log.Error(args)
23+
}
24+
25+
func (l *ZapLogger) Errorf(format string, args ...interface{}) {
26+
l.log.Errorf(format, args)
27+
}
28+
29+
func (l *ZapLogger) Warn(args ...interface{}) {
30+
l.log.Warn(args)
31+
}
32+
33+
func (l *ZapLogger) Warnf(format string, args ...interface{}) {
34+
l.log.Warnf(format, args)
35+
}
36+
37+
func (l *ZapLogger) Info(args ...interface{}) {
38+
l.log.Info(args)
39+
}
40+
41+
func (l *ZapLogger) Infof(format string, args ...interface{}) {
42+
l.log.Infof(format, args)
43+
}
44+
45+
func (l *ZapLogger) Debug(args ...interface{}) {
46+
l.log.Debug(args)
47+
}
48+
49+
func (l *ZapLogger) Debugf(format string, args ...interface{}) {
50+
l.log.Debugf(format, args)
51+
}
52+
53+
func (l *ZapLogger) Trace(args ...interface{}) {
54+
if l.level != config.TraceLevel {
55+
l.log.Debug(args)
56+
}
57+
}
58+
59+
func (l *ZapLogger) Tracef(format string, args ...interface{}) {
60+
if l.level != config.TraceLevel {
61+
l.log.Debugf(format, args)
62+
}
63+
}
64+
65+
func createZapSugaredLogger(conf *config.ApplicationConfig) (*zap.SugaredLogger, error) {
66+
var zConf zap.Config
67+
switch conf.Env {
68+
case config.Prod:
69+
zConf = zap.NewProductionConfig()
70+
case config.Dev:
71+
zConf = zap.NewDevelopmentConfig()
72+
default:
73+
zConf = zap.NewDevelopmentConfig()
74+
}
75+
zConf.Level.SetLevel(conf.Logger.Level.ToZapLevel())
76+
77+
//We are using the wrapper, so to remove the wrapper from the call trace, we need to add AddCallerSkip option
78+
logger, err := zConf.Build(zap.AddCallerSkip(1))
79+
if err != nil {
80+
return nil, err
81+
}
82+
83+
return logger.Sugar(), nil
84+
}
85+
86+
func newZapLogger(conf *config.ApplicationConfig) (*ZapLogger, error) {
87+
logger, err := createZapSugaredLogger(conf)
88+
if err != nil {
89+
return nil, err
90+
}
91+
92+
zapLogger := &ZapLogger{
93+
log: logger,
94+
level: conf.Logger.Level,
95+
}
96+
97+
return zapLogger, nil
98+
}

internal/queue/consumer.go

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

33
import (
44
"github.com/rog-golang-buddies/api-hub_data-scraping-service/internal/config"
5+
"github.com/rog-golang-buddies/api-hub_data-scraping-service/internal/logger"
56
"github.com/wagslane/go-rabbitmq"
67
"io"
7-
"log"
88
)
99

1010
//Consumer is just an interface for the library consumer which doesn't have one.
@@ -19,22 +19,23 @@ type Consumer interface {
1919
) error
2020
}
2121

22-
func NewConsumer(conf config.QueueConfig) (Consumer, error) {
22+
func NewConsumer(conf config.QueueConfig, log logger.Logger) (Consumer, error) {
2323
consumer, err := rabbitmq.NewConsumer(
2424
conf.Url,
2525
rabbitmq.Config{},
2626
rabbitmq.WithConsumerOptionsLogging,
27+
rabbitmq.WithConsumerOptionsLogger(log),
2728
)
2829
if err != nil {
2930
return nil, err
3031
}
3132
return &consumer, nil
3233
}
3334

34-
func CloseConsumer(consumer Consumer) {
35-
log.Println("closing consumer")
35+
func CloseConsumer(consumer Consumer, log logger.Logger) {
36+
log.Info("closing consumer")
3637
err := consumer.Close()
3738
if err != nil {
38-
log.Println("error while closing consumer: ", err)
39+
log.Error("error while closing consumer: ", err)
3940
}
4041
}

0 commit comments

Comments
 (0)