golang实现彩色日志输出的slog.Handler插件库tint的使用

golang实现彩色日志输出的slog.Handler插件库tint的使用

tint是一个零依赖的slog.Handler实现,可以输出彩色(着色)日志。它的输出格式灵感来自zerolog.ConsoleWriterslog.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

1 回复

更多关于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集成到你的项目中,并根据需要自定义颜色和格式。

回到顶部