forked from im-kulikov/helium
/
zap.go
80 lines (69 loc) · 1.54 KB
/
zap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package logger
import (
"github.com/im-kulikov/helium/settings"
"github.com/spf13/viper"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// Config for logger
type Config struct {
Level string
Format string
}
func NewLoggerConfig(v *viper.Viper) *Config {
return &Config{
Level: v.GetString("log.level"),
Format: v.GetString("log.format"),
}
}
// SafeLevel returns valid logger level
// use info level by default
func (c Config) SafeLevel() string {
switch c.Level {
case "debug", "DEBUG":
case "info", "INFO":
case "warn", "WARN":
case "error", "ERROR":
case "panic", "PANIC":
case "fatal", "FATAL":
default:
return "info"
}
return c.Level
}
// SafeFormat returns valid logger output format
// use json by default
func (c Config) SafeFormat() string {
switch c.Format {
case "console":
case "json":
default:
return "json"
}
return c.Format
}
// NewSugaredLogger
func NewSugaredLogger(log *zap.Logger) *zap.SugaredLogger {
return log.Sugar()
}
// Init logger
func NewLogger(lcfg *Config, app *settings.App) (*zap.Logger, error) {
cfg := zap.NewProductionConfig()
cfg.OutputPaths = []string{"stdout"}
cfg.ErrorOutputPaths = []string{"stdout"}
cfg.Encoding = lcfg.SafeFormat()
cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
var lvl zapcore.Level
if err := lvl.Set(lcfg.Level); err != nil {
return nil, err
}
cfg.Level = zap.NewAtomicLevelAt(lvl)
l, err := cfg.Build()
if err != nil {
return nil, err
}
return l.With(
zap.String("app_name", app.Name),
zap.String("app_version", app.BuildVersion),
), nil
}