Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: 新增自定义CtxKeys功能注意事项

v2版本开始,glog组件将ctx上下文变量作为日志打印的必需参数。

自定义CtxKeys

日志组件支持自定义的键值打印,通过ctx上下文变量中读取。

使用配置

glog支持标准库context.Context接口对象中上下文变量的自动读取打印。

键名配置

我们推荐使用配置文件来对上下文中的键名进行配置,例如:

Code Block
languagego
# 日志组件配置
[logger]:
    Path    = "/var/log/my-app"
    Level   =Level:   "all"
    Stdout:  = falsetrue
    CtxKeys =: ["RequestId", "UserId"]

其中CtxKeys用于配置需要从context.Context接口对象中读取并输出的键名。

日志输出

在输出日志的时候,需要通过使用上述配置,然后在输出日志的时候,通过Ctx链式操作方法指定输出的context.Context接口对象,例如:接口对象,请注意不要使用自定义类型作为Key,否则无法输出到日志文件中,例如:

Code Block
languagego
ctx :package main

import (
	"context"

	"github.com/gogf/gf/v2/frame/g"
)

func main() {
	var ctx = context.WithValue(Background()

	// 可以直接使用String作为Key
	ctx = context.BackgroundWithValue()ctx, "RequestId", "123456789")
g.Log().Ctx(ctx).Error("runtime error
	// 如需将Key提取为公共变量,可以使用gctx.StrKey类型,或直接使用string类型
	const userIdKey gctx.StrKey = "UserId" // or const userIdKey = "UserId"
	ctx = context.WithValue(ctx, userIdKey, "10000")

	// 不能自定义类型
	type notPrintKeyType string
	const notPrintKey notPrintKeyType = "NotPrintKey"
	ctx = context.WithValue(ctx, notPrintKey, "notPrintValue") // 不会打印 notPrintValue

	g.Log().Error(ctx, "runtime error")
}

 执行后,终端输出:

Code Block
languagexml
2024-09-26 11:45:33.790May Output:
// 2020-06-08 20:17:03.630 [ERRO] {RequestId:123456789, 12345678910000} runtime error 
// Stack:
1.  main.main
    /Users/teemo/GolandProjects/gogf/demo/ ...

链路跟踪

goframe v1.15版本开始,日志组件增加了对OpenTelemetry规范的链路跟踪支持,该支持是标准化形式的,无需开发者做任何设置,具体请参考章节:链路跟踪

使用示例

除了链路跟踪能够实现全链路的TraceId记录打印之外,由于框架组件完备并且设计良好,因此glog组件也可以实现最小成本的自定义全链路跟踪信息打印。像这样:

Image Removed

1、通过中间件注入RequestId

通过中间件往Context中注入RequestId,并且将RequestId写入到返回的Header中。

Image Removed

2、通过配置文件设置Context Key

为默认的logger以及database logger设置Context Key,便于日志打印时自动读取。

main.go:24

日志示例

Image Added

传递给Handler

如果开发者自定义了日志对象的Handler,那么每个日志打印传递的ctx上下文变量将会传递给Handler中。关于日志Handler的介绍请参考章节:日志组件-Handler

链路跟踪支持

glog组件支持OpenTelemetry标准的链路跟踪特性,该支持是内置的,无需开发者做任何设置,具体请参考章节:服务链路跟踪 

Image AddedImage Removed





Panel
titleContent Menu

Table of Contents