个人博客网站: www.sakurasss.top/ ( 最近打算把个人博客里的那些文章也慢慢移过来吧 )
- Golang 里面的哪些日志库,我个人喜欢用 zerolog,主要是喜欢 zerolog 的链式调用,还有它的性能,虽然 zap 也不错,但是 zap 配置起来我觉得有些麻烦。
- 本来是打算 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:生产模式,关闭终端彩色输出,只留一个文件输出(毕竟终端这个彩色打印性能非常差)