官网 https://zerolog.io/
安装 go get -u github.com/rs/zerolog/log
标准库log做为标准,但功能过于简单,连日志级别都没有
zap是Uber的开源高性能日志库
zerolog更注重开发体验,高性能、有日志级别、链式API,json格式日志记录,号称0内存分配
log.Print()、log.Printf()方法使用方式和标准库log模块类似。
源码中定义的日志级别
type Level int8
const (
// DebugLevel defines debug log level.
DebugLevel Level = iota
// InfoLevel defines info log level.
InfoLevel
// WarnLevel defines warn log level.
WarnLevel
// ErrorLevel defines error log level.
ErrorLevel
// FatalLevel defines fatal log level.
FatalLevel
// PanicLevel defines panic log level.
PanicLevel
// NoLevel defines an absent log level.
NoLevel
// Disabled disables the logger.
Disabled
// TraceLevel defines trace log level.
TraceLevel Level = -1
// Values less than TraceLevel are handled as numbers.
)
定义级别
zerolog.SetGlobalLevel(zerolog.Disabled) //全局定义级别
l3.Level(zerolog.DebugLevel) //子logger定义级别
源码中创建子logger
// Logger is the global logger.
var Logger = zerolog.New(os.Stderr).With().Timestamp().Logger()
见下面代码
package main
import (
"fmt"
"os"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
log.Print("zerolog") //日志输出
log.Info().Msg("info msg")
log.Debug().Msg("debug msg")
fmt.Println(int(zerolog.GlobalLevel())) //全局的日志级别(Zerolog) //-1
zerolog.SetGlobalLevel(zerolog.Disabled)
//方式一: 创建子logger l1 控制台输出
l1 := log.Logger.Level(zerolog.InfoLevel)
fmt.Println(l1.GetLevel()) //打印l1的日志级别
l1.Warn().Msg("l1 warn msg")
//方式二: 创建子logger l2 链式定义
l2 := zerolog.New(os.Stdout).With().Timestamp().Logger()
l2.Level(0) //修改定义日志级别
l2.Info().Msg("l2 info msg")
l2.Debug().Msg("l2 info msg")
fmt.Println(int(l2.GetLevel())) //-1 //打印 l2的日志级别
//文件输出,给下面的l3做输入
f3, err := os.OpenFile("d:/f1.txt",
os.O_CREATE|os.O_RDONLY|os.O_TRUNC, //os.O_TRUNC 清空内容,重新输入
os.ModePerm, //os.O_APPEND 追加输入 二选择1
)
if err != nil {
log.Panic().Err(err).Send() // 内部调用panic
}
defer f3.Close()
//创建子logger l3
l3 := zerolog.New(f3).With().Caller().Timestamp().Logger().Level(2)
l3.Debug().Msg("l3 debug msg") //此行打印不出来,因为消息级别为-1
l3.Warn().Msg("l3 warn msg")
l3.Error().Msg("l3 error msg")
//os.Stderr
// os.Stdin
//os.Stdout
}
时间格式输出
//修改子logger l4的时间输出格式
l4 := zerolog.New(os.Stdout).With().Str("time", time.Now().Format("2006/1/2 15:4:3 -0700")).Logger().Level(-1)
l4.Warn().Msg("l4 warn")
//输出结果
//{"level":"warn","time":"2023/7/24 11:50:11 +0800","message":"l4 warn"}
//修改全局日志级别
//zerolog.SetGlobalLevel(0)
//修改全局时间格式
zerolog.TimeFieldFormat = zerolog.TimeFormatUnixMs //修改为毫秒级时间戳 zerolog.TimeFormatUnix为秒级
zerolog.TimeFieldFormat = "2006-1-2 15:4:3 -0700" //修改全局时间格式
l3.Warn().Msg("l32 warn")
//结果为:{"level":"warn","caller":"e:/gocode/log/main.go:65","time":"2023-7-24 12:3:12 +0800","message":"l32 warn"},l3定义时加了定位代码行 .With().Caller()
将结果输出至变量中
//将日志存于变量中 bytes.Buffer 或 strings.Builder,
//这两个类型都实现了 io.Writer 接口,因此可以将其作为参数传递给日志库的输出方法。
var buf bytes.Buffer
logs := zerolog.New(&buf)
logs.Warn().Msg("aaa")
env1 := buf.String()
fmt.Printf("env1: %T %[1]v \n", env1)
//输出结果:env1: string {"level":"warn","message":"aaa"}
-------------------end