很多项目都需要多个服务配合相互调用,所以请求经常需要有一个traceId来记录和追踪每个请求。
下面介绍下怎么在logrus中添加traceId
其实使用的是logrus的hook钩子
type TraceIdHook struct { TraceId string } func NewTraceIdHook(traceId string) logrus.Hook { hook := TraceIdHook{ TraceId: traceId, } return &hook } func (hook *TraceIdHook) Fire(entry *logrus.Entry) error { entry.Data[consts.TRACE_ID] = hook.TraceId return nil } func (hook *TraceIdHook) Levels() []logrus.Level { return logrus.AllLevels }
自定义了一个TraceId的结构体,实现了logrus中的hook接口,该接口需要实现Fire和Levels两个方法
// 在每个处理器前添加该处理函数,为每个请求添加traceId func AddTraceId(c *gin.Context) { traceId := utils.GetTraceId(c) Logger.AddHook(logger.NewTraceIdHook(traceId)) }
然后再路由中添加该处理函数
func AddRouters(c *gin.Engine) {
c.GET(xxxx, AddTraceId, handler)
}
这样就能实现在每个请求日志里面打印traceId了