Go编程快闪之 logrus日志库
2023/5/24 18:22:08
本文主要是介绍Go编程快闪之 logrus日志库,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
战术卧倒
golang中常见的日志包是logrus, 根据logrus的胚子和我们的生产要求,给出一个生产可用的logrus实践姿势。
主谓宾定状补
logrus是一个结构化的、可插拔的、兼容golang标准log api的日志库。
快速过一下能力
- 支持对output=TTY增加关键字颜色
- 内置JSONFormatter和TextFormatter(默认)两种Formatter
- 支持输出logger所在的函数行位置
log.SetReportCaller(true)
- 可以兼容golang内置的标准log库, 建议无脑替换
- 鼓励输出可解析的日志字段,而不是大段的无法结构化的文本日志
log.WithFields(log.Fields{ "event": event, "topic": topic, "key": key, }).Fatal("Failed to send event")
基于现状,凑了6个钱包上生产,下面给出一些自己的生产实践。
添砖加瓦
1. logrus不支持滚动日志
好马配好鞍 https://github.com/lestrrat-go/file-rotatelogs 让你下雨天不再哭泣。
它会根据配置自动按照时间切分日志,并滚动清理日志(不用配磁盘报警,不用担心磁盘满故障)。
logf, err := rotatelogs.New( cfg.Log.LogDir+logName+".%Y%m%d%H%M", rotatelogs.WithLinkName(cfg.Log.LogDir+logName), rotatelogs.WithMaxAge(24*time.Hour), rotatelogs.WithRotationTime(time.Hour), ) if err != nil { stdLog.Printf("failed to create rotatelogs: %s", err) return }
2. 日志格式化
java生态默认日志输出格式:
11:44:44.827 WARN [93ef3E0120160803114444] [main] [ClassPathXmlApplicationContext] Exception encountered during context initialization - cancelling refresh attempt
在公司中javaer占据主流,故java的默认格式就成了公司集中式日志的"标准"格式。
很明显,logrus默认的两种Formatter都不匹配。
github.com/antonfisher/nested-logrus-formatter 让你柳暗花明。
log.SetFormatter(&nested.Formatter{ // 嵌套日志兼容skynet日志格式 HideKeys: true, FieldsOrder: []string{"region", "node", "topic"}, TimestampFormat: "2006-01-02 15:04:05.000", // 显示ms })
3. 自定义Hook用法:输出默认字段
写本文的时候,发现logrus官方本身支持输出默认日志字段。
requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) requestLogger.Warn("something not great happened")
Hook: 通常 钩子函数用于在触发某种事件时附带一些动作。
logrus的Hook定义:logEntry满足指定的logLevel日志时, 你想要做的动作(你甚至可以不设置output直接在hook输出日志, 这就是内置write hook的实现)。
type Hook interface { Levels() []Level Fire(*Entry) error }
示例代码为logLevel>=info的logEntry,固定了2个日志字段。
type FixedFieldHook struct { LogLevels []logrus.Level FixedField map[string]string } // Fire will be called when some logging function is called with current hook // It will format log entry to string and write it to appropriate writer func (hook *FixedFieldHook) Fire(entry *logrus.Entry) error { for k, v := range hook.FixedField { entry.Data[k] = v } return nil } log.AddHook(&FixedFieldHook{ // Set fixed field FixedField: map[string]string{"region": cfg.LocalRegion, "node": ip}, LogLevels: []logrus.Level{ logrus.InfoLevel, logrus.ErrorLevel, logrus.WarnLevel, logrus.FatalLevel, }, })
抛砖引玉,战术卧倒。
这篇关于Go编程快闪之 logrus日志库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站