111 lines
2.6 KiB
Go
111 lines
2.6 KiB
Go
package log
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
lumberjack "gopkg.in/natefinch/lumberjack.v2"
|
|
"interview-one-stop-server/util"
|
|
"net/url"
|
|
)
|
|
|
|
var log *zap.Logger
|
|
|
|
type lumberjackSink struct {
|
|
*lumberjack.Logger
|
|
}
|
|
|
|
func (l lumberjackSink) Sync() error {
|
|
return nil
|
|
}
|
|
|
|
func GetLogger() *zap.Logger {
|
|
return log
|
|
}
|
|
|
|
func newLogger(logLevel string, logFolder string, dev bool) (*zap.Logger, error) {
|
|
var level zapcore.Level
|
|
switch logLevel {
|
|
case "debug":
|
|
level = zap.DebugLevel
|
|
case "info":
|
|
level = zap.InfoLevel
|
|
case "warning":
|
|
level = zap.WarnLevel
|
|
case "error":
|
|
level = zap.ErrorLevel
|
|
default:
|
|
return nil, fmt.Errorf("unknown log level %s", logLevel)
|
|
}
|
|
|
|
encoderConfig := zapcore.EncoderConfig{
|
|
TimeKey: "ts",
|
|
LevelKey: "level",
|
|
NameKey: "logger",
|
|
MessageKey: "msg",
|
|
StacktraceKey: "stacktrace",
|
|
LineEnding: zapcore.DefaultLineEnding,
|
|
EncodeLevel: zapcore.CapitalLevelEncoder,
|
|
EncodeTime: zapcore.RFC3339TimeEncoder,
|
|
EncodeDuration: zapcore.SecondsDurationEncoder,
|
|
EncodeCaller: zapcore.ShortCallerEncoder,
|
|
ConsoleSeparator: " ",
|
|
}
|
|
ll := lumberjack.Logger{
|
|
Filename: logFolder,
|
|
MaxSize: 100, // MB
|
|
MaxBackups: 31,
|
|
MaxAge: 31, // days
|
|
Compress: false,
|
|
}
|
|
|
|
_ = zap.RegisterSink("lumberjack", func(*url.URL) (zap.Sink, error) {
|
|
return lumberjackSink{
|
|
Logger: &ll,
|
|
}, nil
|
|
})
|
|
|
|
loggerConfig := zap.Config{
|
|
Level: zap.NewAtomicLevelAt(level),
|
|
Development: dev,
|
|
Encoding: "console",
|
|
EncoderConfig: encoderConfig,
|
|
OutputPaths: []string{"stderr", fmt.Sprintf("lumberjack:%s", logFolder)},
|
|
}
|
|
|
|
logger, err := loggerConfig.Build()
|
|
if err != nil {
|
|
panic(fmt.Sprintf("build zap logger from config error: %v", err))
|
|
}
|
|
return logger, nil
|
|
}
|
|
|
|
func init() {
|
|
log, _ = newLogger("info", "logs/app.log", false)
|
|
}
|
|
|
|
func Error(ctx context.Context, label string, msg string) {
|
|
log.Sugar().Error(getTraceIDFromContext(ctx) + " label=" + label + ",msg=" + msg)
|
|
}
|
|
|
|
func Warn(ctx context.Context, label string, msg string) {
|
|
log.Sugar().Warnf(getTraceIDFromContext(ctx) + " label=" + label + ",msg=" + msg)
|
|
}
|
|
|
|
func Info(ctx context.Context, label string, msg string) {
|
|
log.Sugar().Info(getTraceIDFromContext(ctx) + " label=" + label + ",msg=" + msg)
|
|
}
|
|
|
|
func Debug(ctx context.Context, label string, msg string) {
|
|
log.Sugar().Debug(getTraceIDFromContext(ctx) + " label=" + label + ",msg=" + msg)
|
|
}
|
|
|
|
func getTraceIDFromContext(ctx context.Context) string {
|
|
traceID := ctx.Value("trace_id")
|
|
if traceID == nil {
|
|
return util.GenUUID()
|
|
}
|
|
return traceID.(string)
|
|
}
|