Golang日志模块之xlog

发布于:2025-05-01 ⋅ 阅读:(17) ⋅ 点赞:(0)

基于douyu的xlog

依赖

github.com/douyu/jupiter/pkg/xlog
go.uber.org/zap
gopkg.in/natefinch/lumberjack.v2

log相关结构体

types/log.go

type Log struct {
	Env              string `toml:"env"`
	InfoLogFileName  string `toml:"infoLogFileName"`
	ErrorLogFileName string `toml:"errorLogFileName"`
	MaxSize          uint32 `toml:"maxSize"`
	MaxBackups       uint32 `toml:"maxBackups"`
	MaxAge           uint32 `toml:"maxAge"`
	Dir              string `toml:"dir"`
	Level            string `toml:"level"`
}

配置文件

config/config.toml

[log]
env = "dev"
infoLogFileName = "info.log"
errorLogFileName = "error.log"
maxSize = 50
maxBackups = 20
maxAge = 7
dir = "./logs/"
level = "info"

解析toml配置文件

config/config.go

package config

import (
	"your-system/types"
	"github.com/BurntSushi/toml"
)

var Conf Config

// Config 定义一个结构体接收toml所有配置
type Config struct {
	Log types.Log
}

func ConfParse() {
	configPath := "./config/config.toml"
	if _, err := toml.DecodeFile(configPath, &Conf); err != nil {
		xlog.Error("get conf failed", xlog.Any("err", err))
		panic(err)
	}
}

xlog 初始化

log/log.go

package log

import (
	"fmt"
	"os"
	"your-system/types"
	"strings"
	"time"

	"github.com/douyu/jupiter/pkg/xlog"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
)
func InitLogger(log *types.Log) {
	// 获取 info、error日志文件的io.Writer 抽象 getFileLogWriter() 在下方实现
	infoWriteSyncer := getLogWriter(log, log.InfoLogFileName)
	errorWriteSyncer := getLogWriter(log, log.ErrorLogFileName)
	encoder := getEncoder()
	level := getLevel(log.Level)
	// 初始化 cores 切片
	var cores []zapcore.Core
	// 如果不是生产环境,添加控制台输出
	fmt.Println(strings.ToLower(log.Env))
	if strings.ToLower(log.Env) != "prd" {
		cores = append(cores,
			zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.DebugLevel), // 打印到控制台
		)
	}
	cores = append(cores,
		// 向文件写日志, 生产环境不往控制台输出,生产环境记得改成Info
		zapcore.NewCore(encoder, zapcore.AddSync(infoWriteSyncer), level),
		zapcore.NewCore(encoder, zapcore.AddSync(errorWriteSyncer), zapcore.ErrorLevel),
	)

	core := zapcore.NewTee(cores...)
	logger := zap.New(core, zap.AddCaller())
	xlog.SetDefault(logger)
}

func getLogWriter(log *types.Log, logFileName string) zapcore.WriteSyncer {
	lumberJackLogger := &lumberjack.Logger{
		Filename:   fmt.Sprintf("%s%s", log.Dir, logFileName),
		MaxSize:    int(log.MaxSize),
		MaxBackups: int(log.MaxBackups),
		MaxAge:     int(log.MaxAge),
		LocalTime:  true,
		Compress:   false, //是否压缩/归档旧文件

	}
	syncFile := zapcore.AddSync(lumberJackLogger) // 打印到文件
	return zapcore.NewMultiWriteSyncer(syncFile)
}

// 负责设置 encoding 的日志格式
func getEncoder() zapcore.Encoder {
	encoderConfig := zap.NewProductionEncoderConfig()
	// 序列化时间。eg: 2006-01-02 15:04:05.00
	encoderConfig.EncodeTime = cEncodeTime
	encoderConfig.TimeKey = "time"
	encoderConfig.EncodeDuration = zapcore.SecondsDurationEncoder
	// 将Level序列化为全大写字符串。例如,将info level序列化为INFO。
	encoderConfig.EncodeLevel = cEncodeLevel
	// 以 package/file:行 的格式 序列化调用程序,从完整路径中删除除最后一个目录外的所有目录。
	encoderConfig.EncodeCaller = cEncodeCaller
	return zapcore.NewConsoleEncoder(encoderConfig)
}

// cEncodeLevel 自定义日志级别显示
func cEncodeLevel(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
	zapcore.CapitalLevelEncoder(level, enc)
}

// cEncodeTime 自定义时间格式显示
func cEncodeTime(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString("[" + t.Format("2006-01-02 15:04:05.000") + "]")
}

// cEncodeCaller 自定义行号显示
func cEncodeCaller(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString("[" + caller.TrimmedPath() + "]")
}

func getLevel(level string) zapcore.Level {
	switch strings.ToLower(level) {
	case "debug":
		return zapcore.DebugLevel
	case "info":
		return zapcore.InfoLevel
	case "warn":
		return zapcore.WarnLevel
	case "error":
		return zapcore.ErrorLevel
	case "panic":
		return zapcore.PanicLevel
	case "fata":
		return zapcore.FatalLevel
	default:
		return zapcore.DebugLevel
	}
}

主入口文件

main.go

package main

import (
	"your-system/config"
	"strings"
	"time"

	"github.com/douyu/jupiter/pkg/xlog"
)
func main(){
	config.ConfParse()
	log.InitLogger(&config.Conf.Log)
	object := 
	xlog.Error("ErrorMsg ", xlog.Any("object", config.Conf.Log), xlog.String("string", "123123"))
}

在其他地方使用的时候,只需要 import “github.com/douyu/jupiter/pkg/xlog”,使用类似 xlog.Error("ErrorMsg ", xlog.Any(“object”, config.Conf.Log), xlog.String(“string”, “123123”)) 语法即可


网站公告

今日签到

点亮在社区的每一天
去签到