本文最后更新于 2024-09-06,文章内容可能已经过时。

package app

import (
	"io"
	"log"
	"os"
	"strings"
	"testing"
)

// HookWriter 实现了 io.Writer 接口,在写入时执行自定义函数
type HookWriter struct {
	inner io.Writer
	hook  func(string)
}

func (hw *HookWriter) Write(p []byte) (n int, err error) {
	// 将字节切片转换为字符串
	logMsg := string(p)

	// 去除字符串末尾的换行符(因为 log 输出时会自动添加换行符)
	logMsg = strings.TrimSuffix(logMsg, "\n")

	// 执行自定义函数
	hw.hook(logMsg)

	// 将数据写入内部的 io.Writer
	return hw.inner.Write(p)
}

func TestLog(t *testing.T) {
	// 创建一个 HookWriter,内部写入 os.Stdout,同时定义一个钩子函数
	hookWriter := &HookWriter{
		inner: os.Stdout,
		hook: func(msg string) {
			// 这里可以添加自定义的逻辑
			if strings.Contains(msg, "error") {
				log.Println("Custom function: detected an error in the log message")
			}
		},
	}

	// 创建一个新的 log.Logger,使用 HookWriter
	logger := log.New(hookWriter, "", log.LstdFlags)

	logger.Fatalln("This is a normal log message")
	logger.Println("This is an error log message")
}