日志配置traceId,可进行链路追踪

This commit is contained in:
kwinwong
2024-06-21 16:27:30 +08:00
parent ec0af20b1d
commit 48e8292752
13 changed files with 77 additions and 37 deletions

View File

@@ -6,16 +6,15 @@ import (
)
type Api struct {
}
// CurrentUser 获取当前用户
func (a Api)currentUser(c *gin.Context) *model.User {
func (a Api) currentUser(c *gin.Context) *model.User {
if userId, _ := c.Get("userId"); userId != nil {
user, err := model.GetUser(userId)
user, err := model.GetUser(c, userId)
if err == nil {
return &user
}
}
return nil
}
}

View File

@@ -28,7 +28,7 @@ func (a UserController) UserRegister(c *gin.Context) (res interface{}, err error
return
}
res = service.Register(param)
res = service.Register(c, param)
return
}

View File

@@ -14,10 +14,10 @@ type UserService struct {
}
// Login 用户登录函数
func (service *UserService) Login(c *gin.Context, loginRequest request.LoginRequest) response.Response {
func (service *UserService) Login(ctx *gin.Context, loginRequest request.LoginRequest) response.Response {
var userModel model.User
if err := global.DB.Where("user_name = ?", loginRequest.UserName).First(&userModel).Error; err != nil {
if err := global.DB(ctx).Where("user_name = ?", loginRequest.UserName).First(&userModel).Error; err != nil {
return response.ParamErr("账号或密码错误", nil, nil)
}
@@ -34,7 +34,7 @@ func (service *UserService) Login(c *gin.Context, loginRequest request.LoginRequ
}
// valid 验证表单
func (service *UserService) valid(registerRequest request.RegisterRequest) *response.Response {
func (service *UserService) valid(ctx *gin.Context, registerRequest request.RegisterRequest) *response.Response {
if registerRequest.PasswordConfirm != registerRequest.Password {
return &response.Response{
Code: 40001,
@@ -43,7 +43,7 @@ func (service *UserService) valid(registerRequest request.RegisterRequest) *resp
}
count := int64(0)
global.DB.Model(&model.User{}).Where("nickname = ?", registerRequest.Nickname).Count(&count)
global.DB(ctx).Model(&model.User{}).Where("nickname = ?", registerRequest.Nickname).Count(&count)
if count > 0 {
return &response.Response{
Code: 40001,
@@ -52,7 +52,7 @@ func (service *UserService) valid(registerRequest request.RegisterRequest) *resp
}
count = 0
global.DB.Model(&model.User{}).Where("user_name = ?", registerRequest.UserName).Count(&count)
global.DB(ctx).Model(&model.User{}).Where("user_name = ?", registerRequest.UserName).Count(&count)
if count > 0 {
return &response.Response{
Code: 40001,
@@ -64,7 +64,7 @@ func (service *UserService) valid(registerRequest request.RegisterRequest) *resp
}
// Register 用户注册
func (service *UserService) Register(registerRequest request.RegisterRequest) response.Response {
func (service *UserService) Register(ctx *gin.Context, registerRequest request.RegisterRequest) response.Response {
user := model.User{
Nickname: registerRequest.Nickname,
UserName: registerRequest.UserName,
@@ -72,7 +72,7 @@ func (service *UserService) Register(registerRequest request.RegisterRequest) re
}
// 表单验证
if err := service.valid(registerRequest); err != nil {
if err := service.valid(ctx, registerRequest); err != nil {
return *err
}
@@ -87,7 +87,7 @@ func (service *UserService) Register(registerRequest request.RegisterRequest) re
}
// 创建用户
if err := global.DB.Create(&user).Error; err != nil {
if err := global.DB(ctx).Create(&user).Error; err != nil {
return response.ParamErr("注册失败", nil, err)
}

View File

@@ -1,6 +1,7 @@
package model
import (
"context"
"fastApi/core/global"
"github.com/golang-jwt/jwt/v4"
"golang.org/x/crypto/bcrypt"
@@ -34,9 +35,9 @@ const (
)
// GetUser 用ID获取用户
func GetUser(ID interface{}) (User, error) {
func GetUser(ctx context.Context, ID interface{}) (User, error) {
var user User
result := global.DB.First(&user, ID)
result := global.DB(ctx).First(&user, ID)
return user, result.Error
}

View File

@@ -16,5 +16,5 @@ func init() {
}
func migrate(cmd *cobra.Command, args []string) {
_ = global.DB.AutoMigrate(&model.User{})
_ = global.GDB.AutoMigrate(&model.User{})
}

View File

@@ -1,6 +1,7 @@
package global
import (
"context"
ut "github.com/go-playground/universal-translator"
"github.com/go-redis/redis"
"github.com/nsqio/go-nsq"
@@ -8,11 +9,16 @@ import (
"gorm.io/gorm"
)
const DBKey = "DB"
var (
Trans ut.Translator // 定义一个全局翻译器T
Log *zap.Logger
SLog *zap.SugaredLogger
DB *gorm.DB // DB 数据库链接单例
GDB *gorm.DB // DB 数据库链接单例
Redis *redis.Client
Producer *nsq.Producer
)
func DB(ctx context.Context) *gorm.DB {
return ctx.Value(DBKey).(*gorm.DB)
}

View File

@@ -43,5 +43,5 @@ func Database() {
sqlDB.SetMaxIdleConns(viper.GetInt("database.max_idle_conn"))
//打开
sqlDB.SetMaxOpenConns(viper.GetInt("database.max_open_conn"))
global.DB = db
global.GDB = db
}

View File

@@ -1,7 +1,9 @@
package logger
import (
"context"
"fastApi/core/global"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/spf13/viper"
"go.uber.org/zap"
@@ -10,6 +12,8 @@ import (
"os"
)
const loggerKey = "Log"
const loggerSugarKey = "LogSugar"
const TraceId = "traceId"
var logger *zap.Logger
@@ -56,8 +60,31 @@ func CalcTraceId() (traceId string) {
return uuid.New().String()
}
func With(fields ...zap.Field) {
global.Log = logger.With(fields...)
global.SLog = global.Log.Sugar()
global.DB.Logger = NewGormLog(global.Log)
func With(c *gin.Context, fields ...zap.Field) {
log := logger.With(fields...)
slog := log.Sugar()
db := global.GDB
db.Logger = NewGormLog(log)
c.Set(loggerKey, log)
c.Set(loggerSugarKey, slog)
c.Set(global.DBKey, db)
}
func WithC(c context.Context, fields ...zap.Field) context.Context {
log := logger.With(fields...)
slog := log.Sugar()
db := global.GDB
db.Logger = NewGormLog(log)
c = context.WithValue(c, loggerKey, log)
c = context.WithValue(c, loggerSugarKey, slog)
c = context.WithValue(c, global.DBKey, db)
return c
}
func Log(c context.Context) *zap.Logger {
return c.Value(loggerKey).(*zap.Logger)
}
func SLog(c context.Context) *zap.SugaredLogger {
return c.Value(loggerSugarKey).(*zap.SugaredLogger)
}

View File

@@ -128,6 +128,7 @@ func AddTraceId() gin.HandlerFunc {
traceId := logger.CalcTraceId()
ctx.Set(logger.TraceId, traceId)
logger.With(
ctx,
zap.String("traceId", traceId),
)
ctx.Next()

View File

@@ -50,8 +50,9 @@ func CronInit() {
Cron.Start()
}
func WithRequestId(name, traceId string) {
logger.With(
func WithRequestId(ctx context.Context, name, traceId string) context.Context {
return logger.WithC(
ctx,
zap.String("traceId", traceId),
zap.String("name", name),
)
@@ -62,7 +63,7 @@ func BaseCronFuc(name string, cmd func(context.Context)) func() {
traceId := uuid.New().String()
ctx := context.WithValue(context.Background(), logger.TraceId, traceId)
WithRequestId(name, traceId)
ctx = WithRequestId(ctx, name, traceId)
cmd(ctx)
}
}

View File

@@ -3,7 +3,7 @@ package crontab
import (
"context"
"fastApi/app/model"
"fastApi/core/global"
"fastApi/core/logger"
)
func init() {
@@ -22,6 +22,6 @@ func (j testJob) getName() string {
}
func (j testJob) Run(ctx context.Context) {
model.GetUser(1)
global.Log.Info("tick every 1 second run once")
model.GetUser(ctx, 1)
logger.Log(ctx).Info("tick every 1 second run once")
}

View File

@@ -14,6 +14,8 @@ import (
var MQList []InterfaceMQ
type HandleFunc func(context.Context, string) error
type InterfaceMQ interface {
Producer(ctx context.Context, message []byte, delay ...time.Duration) error
HandleMessage(msg *nsq.Message) error
@@ -65,7 +67,7 @@ func (b *BaseMQ) Producer(ctx context.Context, message []byte, delay ...time.Dur
return err
}
func (b *BaseMQ) Handle(msg *nsq.Message, h func(string) error) error {
func (b *BaseMQ) Handle(msg *nsq.Message, h HandleFunc) error {
startTime := time.Now()
var data map[string]string
@@ -79,14 +81,16 @@ func (b *BaseMQ) Handle(msg *nsq.Message, h func(string) error) error {
).Error("数据解析失败: " + err.Error())
}
logger.With(
ctx := context.WithValue(context.Background(), logger.TraceId, data["traceId"])
logger.WithC(
ctx,
zap.String("traceId", data["traceId"]),
)
err = h(data["message"])
err = h(ctx, data["message"])
endTime := time.Now()
latencyTime := endTime.Sub(startTime)
log := global.Log.With(
log := logger.Log(ctx).With(
zap.String("url", b.GetTopic()),
zap.String("params", data["message"]),
zap.Uint16("attempts", msg.Attempts),

View File

@@ -1,8 +1,9 @@
package mq
import (
"context"
"fastApi/app/model"
"fastApi/core/global"
"fastApi/core/logger"
"github.com/nsqio/go-nsq"
)
@@ -11,9 +12,9 @@ type SendRegisteredEmail struct {
}
func (c *SendRegisteredEmail) HandleMessage(msg *nsq.Message) error {
return c.Handle(msg, func(data string) error {
model.GetUser(1)
global.Log.Info("ok")
return c.Handle(msg, func(ctx context.Context, data string) error {
model.GetUser(ctx, 1)
logger.Log(ctx).Info("ok")
return nil
})
}