interview-one-stop-server/util/log/log.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)
}