Files
kratos-bootstrap/logger.go
2023-11-02 20:25:11 +08:00

180 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package bootstrap
import (
"os"
"github.com/sirupsen/logrus"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
aliyunLogger "github.com/go-kratos/kratos/contrib/log/aliyun/v2"
fluentLogger "github.com/go-kratos/kratos/contrib/log/fluent/v2"
logrusLogger "github.com/go-kratos/kratos/contrib/log/logrus/v2"
tencentLogger "github.com/go-kratos/kratos/contrib/log/tencent/v2"
zapLogger "github.com/go-kratos/kratos/contrib/log/zap/v2"
"github.com/go-kratos/kratos/v2/log"
"github.com/go-kratos/kratos/v2/middleware/tracing"
conf "github.com/tx7do/kratos-bootstrap/gen/api/go/conf/v1"
)
type LoggerType string
const (
LoggerTypeStd LoggerType = "std"
LoggerTypeFluent LoggerType = "fluent"
LoggerTypeLogrus LoggerType = "logrus"
LoggerTypeZap LoggerType = "zap"
LoggerTypeAliyun LoggerType = "aliyun"
LoggerTypeTencent LoggerType = "tencent"
)
// NewLoggerProvider 创建一个新的日志记录器提供者
func NewLoggerProvider(cfg *conf.Logger, serviceInfo *ServiceInfo) log.Logger {
l := NewLogger(cfg)
return log.With(
l,
"service.id", serviceInfo.Id,
"service.name", serviceInfo.Name,
"service.version", serviceInfo.Version,
"ts", log.DefaultTimestamp,
"caller", log.DefaultCaller,
"trace_id", tracing.TraceID(),
"span_id", tracing.SpanID(),
)
}
// NewLogger 创建一个新的日志记录器
func NewLogger(cfg *conf.Logger) log.Logger {
if cfg == nil {
return NewStdLogger()
}
switch LoggerType(cfg.Type) {
default:
fallthrough
case LoggerTypeStd:
return NewStdLogger()
case LoggerTypeFluent:
return NewFluentLogger(cfg)
case LoggerTypeZap:
return NewZapLogger(cfg)
case LoggerTypeLogrus:
return NewLogrusLogger(cfg)
case LoggerTypeAliyun:
return NewAliyunLogger(cfg)
case LoggerTypeTencent:
return NewTencentLogger(cfg)
}
}
// NewStdLogger 创建一个新的日志记录器 - Kratos内置控制台输出
func NewStdLogger() log.Logger {
l := log.NewStdLogger(os.Stdout)
return l
}
// NewZapLogger 创建一个新的日志记录器 - Zap
func NewZapLogger(cfg *conf.Logger) log.Logger {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.TimeKey = "time"
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
encoderConfig.EncodeDuration = zapcore.SecondsDurationEncoder
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
jsonEncoder := zapcore.NewJSONEncoder(encoderConfig)
lumberJackLogger := &lumberjack.Logger{
Filename: cfg.Zap.Filename,
MaxSize: int(cfg.Zap.MaxSize),
MaxBackups: int(cfg.Zap.MaxBackups),
MaxAge: int(cfg.Zap.MaxAge),
}
writeSyncer := zapcore.AddSync(lumberJackLogger)
var lvl = new(zapcore.Level)
if err := lvl.UnmarshalText([]byte(cfg.Zap.Level)); err != nil {
return nil
}
core := zapcore.NewCore(jsonEncoder, writeSyncer, lvl)
logger := zap.New(core).WithOptions()
wrapped := zapLogger.NewLogger(logger)
return wrapped
}
// NewLogrusLogger 创建一个新的日志记录器 - Logrus
func NewLogrusLogger(cfg *conf.Logger) log.Logger {
loggerLevel, err := logrus.ParseLevel(cfg.Logrus.Level)
if err != nil {
loggerLevel = logrus.InfoLevel
}
var loggerFormatter logrus.Formatter
switch cfg.Logrus.Formatter {
default:
fallthrough
case "text":
loggerFormatter = &logrus.TextFormatter{
DisableColors: cfg.Logrus.DisableColors,
DisableTimestamp: cfg.Logrus.DisableTimestamp,
TimestampFormat: cfg.Logrus.TimestampFormat,
}
break
case "json":
loggerFormatter = &logrus.JSONFormatter{
DisableTimestamp: cfg.Logrus.DisableTimestamp,
TimestampFormat: cfg.Logrus.TimestampFormat,
}
break
}
logger := logrus.New()
logger.Level = loggerLevel
logger.Formatter = loggerFormatter
wrapped := logrusLogger.NewLogger(logger)
return wrapped
}
// NewFluentLogger 创建一个新的日志记录器 - Fluent
func NewFluentLogger(cfg *conf.Logger) log.Logger {
wrapped, err := fluentLogger.NewLogger(cfg.Fluent.Endpoint)
if err != nil {
panic("create fluent logger failed")
return nil
}
return wrapped
}
// NewAliyunLogger 创建一个新的日志记录器 - Aliyun
func NewAliyunLogger(cfg *conf.Logger) log.Logger {
wrapped := aliyunLogger.NewAliyunLog(
aliyunLogger.WithProject(cfg.Aliyun.Project),
aliyunLogger.WithEndpoint(cfg.Aliyun.Endpoint),
aliyunLogger.WithAccessKey(cfg.Aliyun.AccessKey),
aliyunLogger.WithAccessSecret(cfg.Aliyun.AccessSecret),
)
return wrapped
}
// NewTencentLogger 创建一个新的日志记录器 - Tencent
func NewTencentLogger(cfg *conf.Logger) log.Logger {
wrapped, err := tencentLogger.NewLogger(
tencentLogger.WithTopicID(cfg.Tencent.TopicId),
tencentLogger.WithEndpoint(cfg.Tencent.Endpoint),
tencentLogger.WithAccessKey(cfg.Tencent.AccessKey),
tencentLogger.WithAccessSecret(cfg.Tencent.AccessSecret),
)
if err != nil {
panic(err)
return nil
}
return wrapped
}