Skip to content

Commit 428c359

Browse files
authored
Add logger pkg (#67)
* Add logger pkg * minor change * Tests * minor changes * More changes * Refactor logger * fixes * Minor change
1 parent 4a7091e commit 428c359

File tree

21 files changed

+274
-95
lines changed

21 files changed

+274
-95
lines changed

cmd/demo-metrics/main.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package main
22

33
import (
4-
"github.com/zondax/golem/pkg/cli"
54
"github.com/zondax/golem/pkg/constants"
5+
"github.com/zondax/golem/pkg/logger"
66
"github.com/zondax/golem/pkg/metrics"
77
"github.com/zondax/golem/pkg/runner"
88
)
99

1010
func main() {
1111
println("[Demo] Microservice example")
1212

13-
_, _ = cli.InitGlobalLogger(constants.DebugLevel)
14-
13+
logger.InitLogger(logger.Config{Level: constants.DebugLevel})
1514
r := runner.NewRunner()
1615

1716
r.AddTask(metrics.NewTaskMetrics("/metrics", "9090"))

cmd/demo-panic/main.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package main
22

33
import (
4-
"github.com/zondax/golem/pkg/cli"
54
"github.com/zondax/golem/pkg/constants"
5+
"github.com/zondax/golem/pkg/logger"
66
"github.com/zondax/golem/pkg/metrics"
77
"github.com/zondax/golem/pkg/runner"
88
)
99

1010
func main() {
1111
println("[Demo] Panic handler")
1212

13-
_, _ = cli.InitGlobalLogger(constants.DebugLevel)
14-
13+
logger.InitLogger(logger.Config{Level: constants.DebugLevel})
1514
r := runner.NewRunner()
1615

1716
// This will panic

pkg/cli/config.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package cli
22

33
import (
4+
"context"
45
"fmt"
6+
"github.com/zondax/golem/pkg/logger"
57
"strings"
68

79
"github.com/spf13/cobra"
810
"github.com/spf13/viper"
9-
"go.uber.org/zap"
1011
)
1112

1213
func SetupConfiguration(c *cobra.Command) {
1314
var configFileFlag string
1415
c.PersistentFlags().StringVarP(&configFileFlag, "config", "c", "", "The path to the config file to use.")
1516
err := viper.BindPFlag("config", c.PersistentFlags().Lookup("config"))
1617
if err != nil {
17-
zap.S().Fatalf("unable to bind config flag: %+v", err)
18+
logger.GetLoggerFromContext(context.Background()).Fatalf("unable to bind config flag: %+v", err)
1819
}
1920

2021
viper.SetConfigName("config") // config file name without extension
@@ -49,12 +50,12 @@ func LoadConfig[T Config]() (*T, error) {
4950
configFileOverride := viper.GetString("config")
5051
if configFileOverride != "" {
5152
viper.SetConfigFile(configFileOverride)
52-
zap.S().Infof("Using config file: %s", viper.ConfigFileUsed())
53+
logger.GetLoggerFromContext(context.Background()).Infof("Using config file: %s", viper.ConfigFileUsed())
5354
}
5455

5556
err = viper.ReadInConfig()
5657
if err != nil {
57-
zap.S().Fatalf("%+v", err)
58+
logger.GetLoggerFromContext(context.Background()).Fatalf("%+v", err)
5859
}
5960

6061
// adds all default+configFile values in viper to struct

pkg/cli/handlers.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package cli
22

33
import (
4-
"go.uber.org/zap"
4+
"context"
5+
"github.com/zondax/golem/pkg/logger"
56
"os"
67
"os/signal"
78
"syscall"
@@ -14,13 +15,13 @@ func setupCloseHandler(handler CleanUpHandler) {
1415
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
1516
go func() {
1617
<-c
17-
zap.S().Warn("\r- Ctrl+C pressed in Terminal")
18+
logger.GetLoggerFromContext(context.Background()).Warn("\r- Ctrl+C pressed in Terminal")
1819

1920
if handler != nil {
2021
handler()
2122
}
2223

23-
_ = zap.S().Sync() // Sync logger
24+
_ = logger.Sync() // Sync logger
2425
// TODO: friendly closing callback
2526
os.Exit(0)
2627
}()

pkg/cli/logging.go

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

pkg/cli/root.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"github.com/spf13/cobra"
66
"github.com/spf13/viper"
77
"github.com/zondax/golem/pkg/constants"
8-
"go.uber.org/zap"
8+
"github.com/zondax/golem/pkg/logger"
99
"os"
1010
)
1111

@@ -69,8 +69,7 @@ func (c *CLI) init() {
6969
c.GetRoot().AddCommand(versionCmd)
7070

7171
// TODO: We can make this optional? and more configurable if we see the need
72-
// Initialize logger
73-
_, _ = InitGlobalLogger(constants.DebugLevel)
72+
logger.InitLogger(logger.Config{Level: constants.DebugLevel})
7473
setupCloseHandler(nil)
7574
// Set Configuration Defaults
7675
setupDefaultConfiguration(func() {
@@ -96,11 +95,11 @@ func (c *CLI) Run() {
9695
if err != nil {
9796
return
9897
}
99-
_ = zap.S().Sync()
98+
_ = logger.Sync()
10099
os.Exit(1)
101100
}
102101
}
103102

104103
func (c *CLI) Close() {
105-
_ = zap.S().Sync()
104+
_ = logger.Sync()
106105
}

pkg/logger/logger.go

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package logger
2+
3+
import (
4+
"go.uber.org/zap"
5+
"go.uber.org/zap/zapcore"
6+
"strings"
7+
"sync"
8+
)
9+
10+
const (
11+
ConsoleEncode = "console"
12+
initializingLogError = "initializing logger error: "
13+
)
14+
15+
var (
16+
defaultConfig = Config{
17+
Level: "info",
18+
}
19+
baseLogger *zap.Logger
20+
lock sync.RWMutex
21+
)
22+
23+
type Config struct {
24+
Level string `json:"level"`
25+
Encoding string `json:"encoding"`
26+
}
27+
28+
type Field struct {
29+
Key string
30+
Value interface{}
31+
}
32+
33+
type Logger struct {
34+
logger *zap.Logger
35+
}
36+
37+
var stringToLevel = map[string]zapcore.Level{
38+
"debug": zapcore.DebugLevel,
39+
"info": zapcore.InfoLevel,
40+
"warn": zapcore.WarnLevel,
41+
"error": zapcore.ErrorLevel,
42+
"fatal": zapcore.FatalLevel,
43+
"panic": zapcore.PanicLevel,
44+
}
45+
46+
func InitLogger(config Config) {
47+
lock.Lock()
48+
defer lock.Unlock()
49+
50+
baseLogger = configureAndBuildLogger(config)
51+
zap.ReplaceGlobals(baseLogger)
52+
}
53+
func NewLogger(opts ...interface{}) *Logger {
54+
lock.Lock()
55+
defer lock.Unlock()
56+
57+
var config Config
58+
var fields []Field
59+
60+
for _, opt := range opts {
61+
switch opt := opt.(type) {
62+
case Config:
63+
config = opt
64+
case Field:
65+
fields = append(fields, opt)
66+
}
67+
}
68+
69+
if config == (Config{}) {
70+
config = DefaultConfig()
71+
}
72+
73+
logger := configureAndBuildLogger(config).With(toZapFields(fields)...)
74+
return &Logger{logger: logger}
75+
}
76+
77+
func configureAndBuildLogger(config Config) *zap.Logger {
78+
cfg := zap.NewProductionConfig()
79+
if strings.EqualFold(config.Encoding, ConsoleEncode) {
80+
cfg = zap.NewDevelopmentConfig()
81+
}
82+
83+
encoderConfig := zap.NewProductionEncoderConfig()
84+
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
85+
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
86+
cfg.EncoderConfig = encoderConfig
87+
88+
level := zapcore.InfoLevel
89+
if l, ok := stringToLevel[strings.ToLower(config.Level)]; ok {
90+
level = l
91+
}
92+
cfg.Level = zap.NewAtomicLevelAt(level)
93+
94+
logger, err := cfg.Build(zap.AddCallerSkip(1), zap.AddStacktrace(zapcore.ErrorLevel))
95+
if err != nil {
96+
panic(initializingLogError + err.Error())
97+
}
98+
99+
return logger
100+
}
101+
102+
func Sync() error {
103+
lock.Lock()
104+
defer lock.Unlock()
105+
106+
return baseLogger.Sync()
107+
}
108+
109+
func DefaultConfig() Config {
110+
return defaultConfig
111+
}
112+
113+
func toZapFields(fields []Field) []zap.Field {
114+
var zapFields []zap.Field
115+
for _, field := range fields {
116+
zapFields = append(zapFields, zap.Any(field.Key, field.Value))
117+
}
118+
return zapFields
119+
}

pkg/logger/methods.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package logger
2+
3+
import (
4+
"context"
5+
"go.uber.org/zap"
6+
)
7+
8+
const (
9+
loggerKey = "golem.logger"
10+
RequestIDKey = "request_id"
11+
)
12+
13+
func (l *Logger) Info(msg string) {
14+
l.logger.Info(msg)
15+
}
16+
17+
func (l *Logger) Debug(msg string) {
18+
l.logger.Debug(msg)
19+
}
20+
21+
func (l *Logger) Warn(msg string) {
22+
l.logger.Warn(msg)
23+
}
24+
25+
func (l *Logger) Error(msg string) {
26+
l.logger.Error(msg)
27+
}
28+
29+
func (l *Logger) DPanic(msg string) {
30+
l.logger.DPanic(msg)
31+
}
32+
33+
func (l *Logger) Panic(msg string) {
34+
l.logger.Panic(msg)
35+
}
36+
37+
func (l *Logger) Fatal(msg string) {
38+
l.logger.Fatal(msg)
39+
}
40+
41+
func (l *Logger) Infof(template string, args ...interface{}) {
42+
l.logger.Sugar().Infof(template, args...)
43+
}
44+
45+
func (l *Logger) Debugf(template string, args ...interface{}) {
46+
l.logger.Sugar().Debugf(template, args...)
47+
}
48+
49+
func (l *Logger) Warnf(template string, args ...interface{}) {
50+
l.logger.Sugar().Warnf(template, args...)
51+
}
52+
53+
func (l *Logger) Errorf(template string, args ...interface{}) {
54+
l.logger.Sugar().Errorf(template, args...)
55+
}
56+
57+
func (l *Logger) DPanicf(template string, args ...interface{}) {
58+
l.logger.Sugar().DPanicf(template, args...)
59+
}
60+
61+
func (l *Logger) Panicf(template string, args ...interface{}) {
62+
l.logger.Sugar().Panicf(template, args...)
63+
}
64+
65+
func (l *Logger) Fatalf(template string, args ...interface{}) {
66+
l.logger.Sugar().Fatalf(template, args...)
67+
}
68+
69+
func (l *Logger) WithFields(fields ...zap.Field) *Logger {
70+
return &Logger{logger: l.logger.With(fields...)}
71+
}
72+
73+
func GetLoggerFromContext(ctx context.Context) *Logger {
74+
logger, ok := ctx.Value(loggerKey).(*Logger)
75+
if !ok {
76+
return NewLogger()
77+
}
78+
return logger
79+
}
80+
81+
func ContextWithLogger(ctx context.Context, logger *Logger) context.Context {
82+
return context.WithValue(ctx, loggerKey, logger) //nolint
83+
}

0 commit comments

Comments
 (0)