当前位置: 首页 > web >正文

Golang日志模块之xlog

基于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 configimport ("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 logimport ("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,// 向文件写日志, 生产环境不往控制台输出,生产环境记得改成Infozapcore.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.00encoderConfig.EncodeTime = cEncodeTimeencoderConfig.TimeKey = "time"encoderConfig.EncodeDuration = zapcore.SecondsDurationEncoder// 将Level序列化为全大写字符串。例如,将info level序列化为INFO。encoderConfig.EncodeLevel = cEncodeLevel// 以 package/file:行 的格式 序列化调用程序,从完整路径中删除除最后一个目录外的所有目录。encoderConfig.EncodeCaller = cEncodeCallerreturn 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.DebugLevelcase "info":return zapcore.InfoLevelcase "warn":return zapcore.WarnLevelcase "error":return zapcore.ErrorLevelcase "panic":return zapcore.PanicLevelcase "fata":return zapcore.FatalLeveldefault:return zapcore.DebugLevel}
}

主入口文件

main.go

package mainimport ("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”)) 语法即可

http://www.xdnf.cn/news/1982.html

相关文章:

  • 58、微服务保姆教程(一)
  • classfinal 修改过源码,支持jdk17 + spring boot 3.2.8
  • BGE-m3 和 BCE-Embedding 模型对比分析
  • 深度强化学习(DRL)实战:从AlphaGo到自动驾驶
  • 三串口进行试验
  • Golang | 倒排索引
  • 前端技术Ajax实战
  • 机器学习基础理论 - 判别模型 vs 生成模型
  • Kafka和其他组件的整合
  • 从零开始学习人工智能Day5-Python3 模块
  • 25%甘油(灭菌)保存菌液以及10%甘油(普通)保存蛋白的原理及操作-实验操作系列-010
  • 驱动开发硬核特训 · Day 21(下篇): 深入剖析 PCA9450 驱动如何接入 regulator 子系统
  • WordPress AI插件能自动写高质量文章吗,如何用AI提升网站流量
  • django.db.utils.OperationalError: (1050, “Table ‘你的表名‘ already exists“)
  • 第十四届蓝桥杯刷题——day20
  • 【大语言模型】大语言模型(LLMs)在工业缺陷检测领域的应用
  • NAT穿透
  • 59、微服务保姆教程(二)Nacos--- 微服务 注册中心 + 配置中心
  • Java知识日常巩固(三)
  • tkinter的窗口构建、原生组件放置和监测事件
  • 互联网实验室的质量管控痛点 质检LIMS系统在互联网企业的应用
  • [FPGA基础] DMA
  • java多线程(6.0)
  • Linux套接字+Sqlite实例:客户端-服务器应用程序教程
  • 科技赋能建筑新未来:中建海龙模块化建筑产品入选中国建筑首批产业化推广产品
  • URP-利用矩阵在Shader中实现物体的平移和缩放
  • 【Google上包前APK自检】
  • Mac中 “XX”文件已损坏,无法打开 解决方案
  • shell命令一
  • uniapp中检查版本,提示升级app,安卓下载apk,ios跳转应用商店