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日志库的更多相关文章
- Go第三方日志库logrus
日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...
- 第三方日志库logrus使用
日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...
- Go之第三方日志库logrus使用
文章引用自 第三方日志库logrus使用 日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库 ...
- 日志服务Python消费组实战(三):实时跨域监测多日志库数据
解决问题 使用日志服务进行数据处理与传递的过程中,你是否遇到如下监测场景不能很好的解决: 特定数据上传到日志服务中需要检查数据内的异常情况,而没有现成监控工具? 需要检索数据里面的关键字,但数据没有建 ...
- Go语言项目中使用zap日志库(翻译)
本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...
- golang-Zap和Go Logger日志库
目录 在Go语言项目中使用Zap日志库 介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 ...
- Go之Zap日志库集成Gin
简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...
- 在Go语言项目中使用Zap日志库
在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...
- Go语言系列之日志库zap
在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中,而不是应用程序控制台. 日志切割-能够根据文件大小.时间或间隔等来切割日志文件. 支持不同的日志级别.例 ...
- golang常用库包:log日志记录-uber的Go日志库zap使用详解
Go 日志记录库:uber-go 的日志操作库 zap 使用 一.简介 zap 是 uber 开源的一个高性能,结构化,分级记录的日志记录包. go1.20.2 zap v1.24.0 zap的特性 ...
随机推荐
- 安装node.js教程------深入使用Vue
教程 1.下载nodejs引擎 网址:https://nodejs.org/en/download/ 选择32-bit或者64-bit都行 2.下载最新版npm.zip压缩包 网址:http://no ...
- RHCE服务----DNS
实验要求: 1.建立DNS服务器,负责解析的域为openedu.com 2.要求将MX记录指向mail.openedu.com,且对应A记录为本机IP 3.要求将NS记录指向ns1.openedu.c ...
- 【Visual Leak Detector】在 QT 中使用 VLD(方式三)
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记. 目录 说明 1. 使用前的准备 2. 在 QT 中使用 VLD 2.1 复制 lib 库及头文件 2.2 在项目 .pro 文件中指明路 ...
- Promise合集
Promise.all Promise.all 可以将多个 Promise 实例包装成一个新的 Promise 实例.所有的 Promise 对象都成功时返回的是一个结果数组,一旦有任何一个 Prom ...
- 介绍ChatGPT:基于GPT-3.5的强大自然语言处理工具
大家好,今天我们来聊一下ChatGPT,一个基于GPT-3.5架构的大型语言模型.ChatGPT在自然语言处理方面有着非常强大的能力,可以进行语言生成.文本分类.对话生成等多种任务.接下来,我们将会详 ...
- Nordic nRF52系列/nRF5340硬件设计(一)选型及原理图设计
Nordic 的BLE系列芯片从第一代的nRF51系列,到第二代的nRF52系列,发展到目前最新的第三代的nRF5340.目前市场中使用最多的nRF52系列一共有七款芯片,它们是:nRF52805.n ...
- 关于安装Sqlyog出现的问题
前言 这篇博客主要是为了分析一下我安装Sqlyog出现的一些问题,也请圈友们帮忙指正一下,我是不是成立冤大头.由于春节前我的电脑死机,我重装了系统,之后格式化了C盘,导致很多软件(之前都安装在C盘)需 ...
- Vue启用报错 RangeError: Invalid typed array length: -4095
近期开发的前端项目项目启用失败,记录下修复过程 RangeError: Invalid typed array length: -4095 错误原因:node版本问题,安装10.x.x 即可 重新安装 ...
- 【LeetCode动态规划#07】01背包问题一维写法(状态压缩)实战,其二(目标和、零一和)
目标和(放满背包的方法有几种) 力扣题目链接(opens new window) 难度:中等 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在你有两个符号 + 和 -.对 ...
- Python_13 接口测试openpyxl和表操作
一.openpyxl 安装 pip install openpyxl 在Terminal中输入 excel操作步骤 找到目标excel 打开 读取数据.编辑excel单元格 保存 关闭 open ...