in pkg/log/logger.go [219:290]
func NewLogger(opts ...Option) (*Logger, error) {
var (
writer zapcore.WriteSyncer
enc zapcore.Encoder
)
o := &options{
logLevel: "warn",
outputFile: "stderr",
}
for _, opt := range opts {
opt.apply(o)
}
level, ok := levelMap[o.logLevel]
if !ok {
return nil, fmt.Errorf("unknown log level %s", o.logLevel)
}
logger := &Logger{
level: level,
}
if o.writeSyncer != nil {
writer = o.writeSyncer
} else {
if o.outputFile == "stdout" {
writer = os.Stdout
} else if o.outputFile == "stderr" {
writer = os.Stderr
} else {
file, err := os.OpenFile(o.outputFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
return nil, err
}
writer = file
}
}
if writer == os.Stdout || writer == os.Stderr {
enc = zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
MessageKey: "message",
LevelKey: "level",
TimeKey: "time",
NameKey: "context",
CallerKey: "caller",
StacktraceKey: "backtrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseColorLevelEncoder,
EncodeTime: zapcore.RFC3339TimeEncoder,
EncodeDuration: zapcore.StringDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
})
} else {
enc = zapcore.NewJSONEncoder(zapcore.EncoderConfig{
MessageKey: "message",
LevelKey: "level",
TimeKey: "time",
NameKey: "context",
CallerKey: "caller",
StacktraceKey: "backtrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.RFC3339NanoTimeEncoder,
EncodeDuration: zapcore.StringDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
})
}
logger.writer = writer
logger.core = zapcore.NewCore(enc, writer, level)
return logger, nil
}