-
Notifications
You must be signed in to change notification settings - Fork 19
/
logger.go
107 lines (99 loc) · 2.34 KB
/
logger.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package log
import (
"fmt"
"net/url"
"os"
"path/filepath"
"strings"
"github.com/baetyl/baetyl-go/errors"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
func init() {
// Config{
// Level: NewAtomicLevelAt(InfoLevel),
// Development: false,
// Sampling: &SamplingConfig{
// Initial: 100,
// Thereafter: 100,
// },
// Encoding: "json",
// EncoderConfig: NewProductionEncoderConfig(),
// OutputPaths: []string{"stderr"},
// ErrorOutputPaths: []string{"stderr"},
// }
c := zap.NewProductionConfig()
c.Sampling = nil
c.OutputPaths = []string{"stdout"}
l, err := c.Build()
if err != nil {
panic(fmt.Sprintf("failed to create default logger: %s", err.Error()))
}
err = zap.RegisterSink("lumberjack", newFileHook)
if err != nil {
l.Error("failed to register lumberjack", Error(err))
}
zap.ReplaceGlobals(l)
}
// Init init and return logger
func Init(cfg Config, fields ...Field) (*Logger, error) {
c := zap.NewProductionConfig()
c.Sampling = nil
if cfg.Filename != "" {
c.OutputPaths = append(c.OutputPaths, "lumberjack:?"+cfg.String())
}
if cfg.Encoding == "console" {
c.Encoding = "console"
c.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
}
c.Level = zap.NewAtomicLevelAt(parseLevel(cfg.Level))
l, err := c.Build(zap.Fields(fields...))
if err != nil {
return nil, errors.Trace(err)
}
zap.ReplaceGlobals(l)
return L(), nil
}
type lumberjackSink struct {
*lumberjack.Logger
}
func (*lumberjackSink) Sync() error {
return nil
}
func newFileHook(u *url.URL) (zap.Sink, error) {
cfg, err := FromURL(u)
if err != nil {
return nil, errors.Trace(err)
}
err = os.MkdirAll(filepath.Dir(cfg.Filename), 0755)
if err != nil {
return nil, errors.Trace(err)
}
return &lumberjackSink{&lumberjack.Logger{
Compress: cfg.Compress,
Filename: cfg.Filename,
MaxAge: cfg.MaxAge,
MaxSize: cfg.MaxSize,
MaxBackups: cfg.MaxBackups,
}}, nil
}
func parseLevel(lvl string) Level {
switch strings.ToLower(lvl) {
case "fatal":
return FatalLevel
case "panic":
return PanicLevel
case "error":
return ErrorLevel
case "warn", "warning":
return WarnLevel
case "info":
return InfoLevel
case "debug":
return DebugLevel
default:
L().Warn("failed to parse log level, use default level (info)", Any("level", lvl))
return InfoLevel
}
}