-
Notifications
You must be signed in to change notification settings - Fork 13
/
logger.go
117 lines (90 loc) · 2.75 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
108
109
110
111
112
113
114
115
116
117
package log
import (
"os"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
type Logger interface {
Info(msg string, fields ...zap.Field)
Warn(msg string, fields ...zap.Field)
Error(msg string, fields ...zap.Field)
Debug(msg string, fields ...zap.Field)
}
type NoOpLogger struct{}
// Debug implements Logger.
func (*NoOpLogger) Debug(msg string, fields ...zapcore.Field) {
// no-op
}
// Error implements Logger.
func (*NoOpLogger) Error(msg string, fields ...zapcore.Field) {
// no-op
}
// Info implements Logger.
func (*NoOpLogger) Info(msg string, fields ...zapcore.Field) {
// no-op
}
// Warn implements Logger.
func (*NoOpLogger) Warn(msg string, fields ...zapcore.Field) {
// no-op
}
var _ Logger = (*NoOpLogger)(nil)
type loggerImpl struct {
zapLogger zap.Logger
}
var _ Logger = (*loggerImpl)(nil)
// Debug implements Logger.
func (l *loggerImpl) Debug(msg string, fields ...zapcore.Field) {
l.zapLogger.Debug(msg, fields...)
}
// Error implements Logger.
func (l *loggerImpl) Error(msg string, fields ...zapcore.Field) {
l.zapLogger.Error(msg, fields...)
}
// Info implements Logger.
func (l *loggerImpl) Info(msg string, fields ...zapcore.Field) {
l.zapLogger.Info(msg, fields...)
}
// Warn implements Logger.
func (l *loggerImpl) Warn(msg string, fields ...zapcore.Field) {
l.zapLogger.Warn(msg, fields...)
}
// NewLogger creates a new logger.
// If fileName is non-empty, it pipes logs to file and stdout.
// if filename is empty, it pipes logs only to stdout.
func NewLogger(isProduction bool, fileName string, logLevelStr string) (Logger, error) {
loggerConfig := zap.NewDevelopmentConfig()
if isProduction {
loggerConfig = zap.NewProductionConfig()
// Ensure JSON output
loggerConfig.Encoding = "json"
// Configure timestamp format
loggerConfig.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
}
logLevel := zap.InfoLevel
isDebugLevel := logLevelStr == "debug"
if isDebugLevel {
logLevel = zap.DebugLevel
}
loggerConfig.Level.SetLevel(logLevel)
consoleEncoder := zapcore.NewConsoleEncoder(loggerConfig.EncoderConfig)
// Configure piping to stdout and to fileName if it is non-empty
var core zapcore.Core
if fileName != "" {
fileEncoder := zapcore.NewJSONEncoder(loggerConfig.EncoderConfig)
f, err := os.Create(fileName)
if err != nil {
return nil, err
}
core = zapcore.NewTee(
zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), zapcore.InfoLevel),
zapcore.NewCore(fileEncoder, zapcore.AddSync(f), zapcore.InfoLevel),
)
} else {
core = zapcore.NewTee(
zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), zapcore.InfoLevel),
)
}
logger := zap.New(core)
logger.Info("log level", zap.Bool("is_debug", isDebugLevel), zap.String("log_level", loggerConfig.Level.String()))
return logger, nil
}