/
log.go
76 lines (63 loc) · 1.8 KB
/
log.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
package log
import (
"errors"
"github.com/sarulabs/di"
"github.com/sepuka/focalism/def"
"github.com/sepuka/focalism/internal/config"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
errPkg "github.com/pkg/errors"
)
const LoggerDef = `logger.def`
func init() {
def.Register(func(builder *di.Builder, cfg *config.Config) error {
return builder.Add(di.Def{
Name: LoggerDef,
Build: func(container di.Container) (interface{}, error) {
var (
err error
logger *zap.Logger
sugar *zap.SugaredLogger
zapCfg zap.Config
core zapcore.Core
fileEncoder zapcore.Encoder
fileEncoderConfig zapcore.EncoderConfig
)
fileSynchronizer, closeOut, err := zap.Open(`stdout`)
if err != nil {
return nil, errPkg.Wrap(err, `unable to open output files`)
}
writeSyncer := zapcore.AddSync(fileSynchronizer)
consoleMsgLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
if cfg.Log.Prod {
return lvl >= zapcore.InfoLevel
}
return true
})
if cfg.Log.Prod {
zapCfg = zap.NewProductionConfig()
fileEncoderConfig = zap.NewProductionEncoderConfig()
} else {
zapCfg = zap.NewDevelopmentConfig()
fileEncoderConfig = zap.NewDevelopmentEncoderConfig()
}
zapCfg.OutputPaths = []string{`stdout`}
fileEncoder = zapcore.NewJSONEncoder(fileEncoderConfig)
core = zapcore.NewTee(
zapcore.NewCore(fileEncoder, writeSyncer, consoleMsgLevel),
)
logger = zap.New(core)
sugar = logger.Sugar()
if sugar == nil {
closeOut()
return nil, errors.New(`unable build sugar logger`)
}
return sugar, err
},
Close: func(obj interface{}) error {
logger := obj.(*zap.SugaredLogger)
return logger.Sync()
},
})
})
}