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

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”)) 语法即可

相关文章:

  • Linux字符设备驱动开发的详细步骤
  • Vue3实现高仿word自定义颜色选择器组件(支持 v-model)
  • 矩阵运营:抢占市场与流量的利器
  • 如何避免IDEA每次打开新项目都重复配置Maven?
  • 【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
  • C++ 基础知识 指针和函数(利用指针作函数的参数修改实参的值)
  • 代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
  • 河道流量监测:雷达流量计与多普勒流量计的优劣势与技术特点分析
  • 【C语言】全局变量、静态本地变量
  • 常见的几种分块策略,每种策略都有适用场景和优缺点
  • 华为L410上制作内网镜像模板:搭建Apache服务器并上传离线WeChat包
  • Linux-05 半个月崩了三次 ubuntu 系统记录
  • 基于STM32、HAL库的ADS1256IDBR模数转换器ADC驱动程序设计
  • 常见的6种外挂获取执行时机方法介绍
  • 安全编排自动化与响应(SOAR):从事件响应到智能编排的技术实践
  • 常见游戏引擎介绍与对比
  • Linux的基础指令
  • Exposure Adjusted Incidence Rate (EAIR) 暴露调整发病率:精准量化疾病风险
  • 关于hbaseRegion和hbaseRowKey的一些处理
  • linux ptrace 图文详解(七) gdb、strace跟踪系统调用
  • 坤莹·帕塔玛·利斯达特拉任世界羽联主席
  • 体坛联播|皇马上演罢赛闹剧,杨瀚森宣布参加NBA选秀
  • 内蒙古纪检干部刘占波履新呼和浩特,曾参与涉煤腐败倒查20年工作
  • “住手!”特朗普罕见公开谴责普京,俄称愿恢复对话但要看美方行动
  • 世卫发布预防少女怀孕新指南,呼吁终止童婚、延长女孩受教育时间
  • 官宣一起打造智能汽车品牌后,华为喊话上汽要准备好足够产能