golang实现彩色日志输出的slog.Handler插件库tint的使用
golang实现彩色日志输出的slog.Handler插件库tint的使用
tint
是一个零依赖的slog.Handler
实现,可以输出彩色(着色)日志。它的输出格式灵感来自zerolog.ConsoleWriter
和slog.TextHandler
。
安装
go get github.com/lmittmann/tint
基本用法
w := os.Stderr
// 创建一个新的logger
logger := slog.New(tint.NewHandler(w, nil))
// 设置全局logger并自定义选项
slog.SetDefault(slog.New(
tint.NewHandler(w, &tint.Options{
Level: slog.LevelDebug,
TimeFormat: time.Kitchen,
}),
))
自定义属性
ReplaceAttr
可以用来修改或删除属性。如果设置了这个函数,它会在每个非组属性被记录之前调用。
创建带有自定义TRACE级别的logger
// 创建一个带有自定义TRACE级别的新logger
const LevelTrace = slog.LevelDebug - 4
w := os.Stderr
logger := slog.New(tint.NewHandler(w, &tint.Options{
Level: LevelTrace,
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if a.Key == slog.LevelKey && len(groups) == 0 {
level, ok := a.Value.Any().(slog.Level)
if ok && level <= LevelTrace {
return tint.Attr(13, slog.String(a.Key, "TRC"))
}
}
return a
},
})
创建不显示时间的logger
// 创建一个不显示时间的新logger
w := os.Stderr
logger := slog.New(
tint.NewHandler(w, &tint.Options{
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if a.Key == slog.TimeKey && len(groups) == 0 {
return slog.Attr{}
}
return a
},
}),
)
创建将所有错误显示为红色的logger
// 创建一个将所有错误显示为红色的新logger
w := os.Stderr
logger := slog.New(
tint.NewHandler(w, &tint.Options{
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if a.Value.Kind() == slog.KindAny {
if _, ok := a.Value.Any().(error); ok {
return tint.Attr(9, a)
}
}
return a
},
}),
)
自动启用颜色
默认情况下颜色是启用的。使用Options.NoColor
字段可以禁用颜色输出。要根据终端能力自动启用颜色,可以使用如go-isatty
包:
w := os.Stderr
logger := slog.New(
tint.NewHandler(w, &tint.Options{
NoColor: !isatty.IsTerminal(w.Fd()),
}),
)
Windows支持
可以通过使用如go-colorable
包来添加Windows上的颜色支持:
w := os.Stderr
logger := slog.New(
tint.NewHandler(colorable.NewColorable(w), nil),
)
更多关于golang实现彩色日志输出的slog.Handler插件库tint的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现彩色日志输出的slog.Handler插件库tint的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用tint实现Golang彩色日志输出
tint是一个轻量级的slog.Handler插件,可以为Golang的结构化日志(slog)添加彩色输出功能。下面我将详细介绍如何使用tint。
tint简介
tint具有以下特点:
- 支持彩色输出,不同日志级别使用不同颜色
- 兼容标准库的slog.Logger
- 轻量级,无额外依赖
- 可自定义颜色和输出格式
安装
go get github.com/lmittmann/tint
基本使用
package main
import (
"log/slog"
"os"
"time"
"github.com/lmittmann/tint"
)
func main() {
// 创建tint handler
handler := tint.NewHandler(os.Stderr, &tint.Options{
Level: slog.LevelDebug,
TimeFormat: time.Kitchen,
})
// 创建logger
logger := slog.New(handler)
// 输出不同级别的日志
logger.Debug("这是一条debug日志", "key", "value")
logger.Info("这是一条info日志", "key", "value")
logger.Warn("这是一条warn日志", "key", "value")
logger.Error("这是一条error日志", "key", "value")
}
自定义选项
tint提供了多种自定义选项:
handler := tint.NewHandler(os.Stdout, &tint.Options{
// 设置最低日志级别
Level: slog.LevelInfo,
// 自定义时间格式
TimeFormat: time.DateTime,
// 禁用彩色输出
NoColor: false,
// 自定义颜色
LevelColors: map[slog.Leveler]tint.Color{
slog.LevelDebug: tint.Magenta,
slog.LevelInfo: tint.Blue,
slog.LevelWarn: tint.Yellow,
slog.LevelError: tint.Red,
},
// 自定义时间颜色
TimeColor: tint.Cyan,
// 自定义消息颜色
MessageColor: tint.White,
})
与标准库集成
tint可以无缝替换标准库的slog默认handler:
package main
import (
"log/slog"
"os"
"github.com/lmittmann/tint"
)
func main() {
// 替换默认handler
slog.SetDefault(slog.New(
tint.NewHandler(os.Stderr, nil),
))
// 现在标准库的slog方法都会使用彩色输出
slog.Info("标准库slog的彩色输出", "key", "value")
}
高级用法
自定义属性颜色
handler := tint.NewHandler(os.Stderr, &tint.Options{
// 自定义属性颜色
AttrColors: map[string]tint.Color{
"user_id": tint.Green,
"error": tint.Red,
},
})
logger := slog.New(handler)
logger.Info("用户登录", "user_id", 123, "error", "无错误")
禁用源文件位置
handler := tint.NewHandler(os.Stderr, &tint.Options{
// 禁用源文件和行号
AddSource: false,
})
自定义输出格式
如果需要更复杂的格式,可以实现自己的Formatter:
type myFormatter struct{}
func (f *myFormatter) Format(
level slog.Level,
time time.Time,
msg string,
attrs []slog.Attr,
) (string, error) {
// 自定义格式实现
return fmt.Sprintf("[%s] %s: %s", time.Format(time.RFC3339), level.String(), msg), nil
}
handler := tint.NewHandler(os.Stderr, &tint.Options{
Formatter: &myFormatter{},
})
性能考虑
tint在设计时考虑了性能因素:
- 使用sync.Pool减少内存分配
- 避免不必要的字符串处理
- 轻量级的颜色编码
在大多数情况下,tint的性能开销可以忽略不计。
总结
tint是一个简单而强大的slog.Handler实现,为Golang的结构化日志添加了彩色输出功能。它易于使用且高度可定制,是提升日志可读性的好选择。
通过上述示例,你可以快速将tint集成到你的项目中,并根据需要自定义颜色和格式。