从 v2.0
版本开始, glog
组件提供了超级强大的、可自定义日志处理的 Handler
特性。 Handler
采用了中间件设计方式,开发者可以为日志对象注册多个处理 Handler
,也可以在 Handler
中覆盖默认的日志组件处理逻辑。
相关定义
Handler
方法定义
// Handler is function handler for custom logging content outputs.
type Handler func(ctx context.Context, in *HandlerInput)
可以看到第二个参数为日志处理的日志信息,并且为指针类型,意味着在 Handler
中可以修改该参数的任意属性信息,并且修改后的内容将会传递给下一个 Handler
。
Handler
参数定义
// HandlerInput is the input parameter struct for logging Handler.
type HandlerInput struct {
Logger *Logger // Current Logger object.
Buffer *bytes.Buffer // Buffer for logging content outputs.
Time time.Time // Logging time, which is the time that logging triggers.
TimeFormat string // Formatted time string, like "2016-01-09 12:00:00".
Color int // Using color, like COLOR_RED, COLOR_BLUE, etc. Eg: 34
Level int // Using level, like LEVEL_INFO, LEVEL_ERRO, etc. Eg: 256
LevelFormat string // Formatted level string, like "DEBU", "ERRO", etc. Eg: ERRO
CallerFunc string // The source function name that calls logging, only available if F_CALLER_FN set.
CallerPath string // The source file path and its line number that calls logging, only available if F_FILE_SHORT or F_FILE_LONG set.
CtxStr string // The retrieved context value string from context, only available if Config.CtxKeys configured.
TraceId string // Trace id, only available if OpenTelemetry is enabled.
Prefix string // Custom prefix string for logging content.
Content string // Content is the main logging content without error stack string produced by logger.
Values []any // The passed un-formatted values array to logger.
Stack string // Stack string produced by logger, only available if Config.StStatus configured.
IsAsync bool // IsAsync marks it is in asynchronous logging.
}
开发者有 两种方式 通过 Handler
自定义日志输出内容:
- 一种是直接修改
HandlerInput
中的属性信息,然后继续执行in.Next(ctx)
,默认的日志输出逻辑会将HandlerInput
中的属性打印为字符串输出。 - 另一种是将日志内容写入到
Buffer
缓冲对象中即可,默认的日志输出逻辑如果发现Buffer
已经存在日志内容将会忽略默认日志输出逻辑。
Handler
注册到 Logger
方法
// SetHandlers sets the logging handlers for current logger.
func (l *Logger) SetHandlers(handlers ...Handler)