golang中常见的logrus日志库

 更新时间:2023年05月25日 08:28:49   作者:博客猿马甲哥  
这篇文章主要介绍了golang中常见的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,
		},
	})

抛砖引玉,战术卧倒。

到此这篇关于golang中常见的logrus日志库的文章就介绍到这了,更多相关golang中logrus日志库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言清除文件中空行的方法

    Go语言清除文件中空行的方法

    这篇文章主要介绍了Go语言清除文件中空行的方法,实例分析了Go语言针对文件的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 解决GO编译时避免引入外部动态库的问题

    解决GO编译时避免引入外部动态库的问题

    最近碰到一个问题,有一个流量采集的组件中使用到了github.com/google/gopacket 这个库,这个库使用一切正常,但是唯独有一个缺点,编译后的二进制文件依赖于libpcap.so的动态库,这篇文章主要介绍了GO编译时避免引入外部动态库的解决方法,需要的朋友可以参考下
    2022-10-10
  • 本地使用Docker搭建go开发环境的全过程

    本地使用Docker搭建go开发环境的全过程

    最近想学习一下golang,自己之前一直把环境全部安装在docker上,所以这次也想把golang的环境安装在docker上,下面这篇文章主要给大家介绍了关于本地使用Docker搭建go开发环境的相关资料,需要的朋友可以参考下
    2022-07-07
  • Golang使用第三方包viper读取yaml配置信息操作

    Golang使用第三方包viper读取yaml配置信息操作

    这篇文章主要介绍了Golang使用第三方包viper读取yaml配置信息操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang定制化zap日志库使用过程分析

    Golang定制化zap日志库使用过程分析

    Zap是我个人比较喜欢的日志库,是uber开源的,有较好的性能,在项目开发中,经常需要把程序运行过程中各种信息记录下来,有了详细的日志有助于问题排查和功能优化,但如何选择和使用性能好功能强大的日志库,这个就需要我们从多角度考虑
    2023-03-03
  • Golang教程之不可重入函数的实现方法

    Golang教程之不可重入函数的实现方法

    这篇文章主要给大家介绍了关于Golang教程之不可重入函数的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • golang连接sqlx库的操作使用指南

    golang连接sqlx库的操作使用指南

    这篇文章主要为大家介绍了golang连接sqlx库的操作使用指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 使用systemd部署和守护golang应用程序的操作方法

    使用systemd部署和守护golang应用程序的操作方法

    systemd是一个流行的守护进程管理器,可以轻松管理服务的启动、停止、重启等操作,让我们的应用程序始终保持在线,本文介绍了如何使用systemd部署和守护golang应用程序,感兴趣的朋友一起看看吧
    2023-10-10
  • 关于go语言编码需要放到src 文件夹下的问题

    关于go语言编码需要放到src 文件夹下的问题

    这篇文章主要介绍了go语言编码需要放到src 文件夹下的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Go语言实现一个Http Server框架(一) http库的使用

    Go语言实现一个Http Server框架(一) http库的使用

    本文主要介绍用Go语言实现一个Http Server框架中对http库的基本使用说明,文中有详细的代码示例,感兴趣的同学可以借鉴一下
    2023-04-04

最新评论