Golang ZeroLog 初始化

429 阅读2分钟

个人博客网站: www.sakurasss.top/ ( 最近打算把个人博客里的那些文章也慢慢移过来吧 )

  1. Golang 里面的哪些日志库,我个人喜欢用 zerolog,主要是喜欢 zerolog 的链式调用,还有它的性能,虽然 zap 也不错,但是 zap 配置起来我觉得有些麻烦。
  2. 本来是打算 slog 出来之后,就不用第三方日志的,然后发现 slog 连时间都不能格式化输出。也没法同时输出到文件终端,想要实现的话,自己还要定义两个 slog ,然后还得自己封装一下

还是用 zerolog 得了,而且 zerolog 还有个全局变量调用的时候比较方便

gihub地址: rs/zerolog: Zero Allocation JSON Logger (github.com)

一: 定义 log.yaml 配置文件

这是最简单的配置。根据自己需求添加字段,增加配置

level: info
# development or production
pattern: development
output: log/log.log

二: 使用 viper 加载配置文件

import (
	"fmt"
	"github.com/spf13/viper"
)

func CreateConfig(file string) *viper.Viper {
	config := viper.New()
	configPath := "config/"
	config.AddConfigPath(configPath) // 文件所在目录
	config.SetConfigName(file)       // 文件名
	config.SetConfigType("yaml")     // 文件类型
	configFile := configPath + file + ".yaml"

	if err := config.ReadInConfig(); err != nil {
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			panic(fmt.Errorf("找不到配置文件:%s", configFile)) //系统初始化阶段发生任何错误,直接结束进程
		} else {
			panic(fmt.Errorf("解析配置文件%s出错:%s", configFile, err))
		}
	}

	return config
}

二: 初始化 log 日志

import (
	"github.com/rs/zerolog"
	"github.com/rs/zerolog/log"
	"os"
	"time"
)

type LogConfig struct {
	Level   string `yaml:"level"`
	Pattern string `yaml:"pattern"`
	OutPut  string `yaml:"output"`
}

// LogInit 完成Zero 日志的初始化
func LogInit() {
	var logConfig LogConfig
	// viper 加载配置
	config := CreateConfig("log")
	// 反序列化结构体
	err := config.Unmarshal(&logConfig)
	if err != nil {
		panic(err)
	}
	//fmt.Printf("%+v \n", logConfig)

	// 设置日志等级
	zerolog.SetGlobalLevel(zerolog.DebugLevel)
	// 日志时间格式
	zerolog.TimeFieldFormat = time.StampMilli

	// 创建文件
	logFile, err := os.OpenFile(logConfig.OutPut, os.O_CREATE|os.O_APPEND, 0600)
	if err != nil {
		panic(err)
	}
	// 控制台输出的输出器
	consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.StampMilli}
	// 创建多个日志输出器
	multi := zerolog.MultiLevelWriter(consoleWriter, logFile)

	// 开启调用位置打印
	log.Logger = log.With().Caller().Logger()

	log.Logger = log.Output(multi)
}
  • 运行
import (
	"Distributed/loadConfig"
	"errors"
	"github.com/rs/zerolog/log"
)

func main() {
	// 初始化配置
	loadConfig.LogInit()

	// 四种日志级别
	log.Debug().Str("name", "sakura").Msg("Debug Msg")
	log.Info().Int("value", 114514).Msg("Info Msg")
	log.Error().Err(errors.New("This is Error")).Msg("Errotr Msg")
	log.Warn().Msg("Warn Msg")
}

运行之后开始看到日志同时在终端,文件输出

还可以自己在 yaml 中定义 development 和 production 两种模式 development : 开发模式,开启终端彩输出 pordectiuon:生产模式,关闭终端彩色输出,只留一个文件输出(毕竟终端这个彩色打印性能非常差)

在这里插入图片描述 在这里插入图片描述