mirror of
https://github.com/kwinH/fastApi.git
synced 2025-12-24 13:07:58 +08:00
日志配置traceId,可进行链路追踪
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -16,5 +16,5 @@ func init() {
|
||||
}
|
||||
|
||||
func migrate(cmd *cobra.Command, args []string) {
|
||||
_ = global.DB.AutoMigrate(&model.User{})
|
||||
_ = global.GDB.AutoMigrate(&model.User{})
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user