Go编程快闪之logrus日志库

news2024/11/26 1:26:54

64527391a8452988236df146a80fc32f.gif

成文耗时1小时,阅读3min,有用指数4颗星。

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个钱包上生产,下面给出一些自己的生产实践🙏。

78db5416a502c29d061dca857d3a64de.jpeg

添砖加瓦

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日志时, 你想要做的动作,比如在产生panic错误,给用户组发短信报警。

(你甚至可以不设置output直接在hook输出日志, 这就是内置write hook[1]的实现)。

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日志库的战术性理解,文辞拙劣,如果错误或者不同见解,欢迎留言探讨。抛砖引玉,战术卧倒🐖。

引用链接

[1] write hook: https://github.com/sirupsen/logrus/blob/master/hooks/writer/writer.go

点“7b84fddbf4c06a538286a1aff0be44d8.gif戳“在看3da59c1d94949740f01963ac473477b4.gif

体现态度很有必要!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/566208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARD2F智能电动机保护器在合盛硅业股份有限公司的应用

摘要:介绍安科瑞ARD2F智能电动机保护器在合盛硅业股份有限公司项目的应用。用于新疆西部合盛硅业20万吨密封胶项目及新疆合盛硅业新材料有限公司二期年产20万吨硅氧烷及下游深加工项目中电动机回路的参数测量、故障保护、起停控制以及后台通讯,为项目的安…

chatgpt赋能python:PythonWMI:掌握Windows管理工具的关键

Python WMI: 掌握Windows管理工具的关键 在Windows系统上,WMI (Windows Management Instrumentation)是一个无价的管理工具,允许用户监控和管理各种Windows组件,包括硬件、操作系统,和应用程序。在Python编程中,通过使…

Android Studio Flamingo 稳定版正式发布

作者 / Android Studio 产品经理 Steven Jenkins 我们非常激动地宣布用于构建 Android 应用的官方 IDE 最新稳定版—— Android Studio Flamingo🦩 现已发布! Android Studio Flamingohttps://developer.android.google.cn/studio 此版本加入了多项改进&…

【30天熟悉Go语言】3 怀着Java看Go的编程规约

文章目录 一、前言二、语法Go和Java的语法区别 注释Go和Java的注释区别 三、代码规范四、API包五、总结和后续 一、前言 Go系列文章: GO开篇:手握Java走进Golang的世界2 Go开发环境搭建、Hello World程序运行 Go专栏传送链接:https://blog.cs…

ChatGPT之后,值得关注的垂直领域大模型

垂直领域大模型是指在特定的领域或行业中经过训练和优化的大型语言模型。与通用语言模型相比,垂直领域大模型更专注于某个特定领域的知识和技能,具备更高的领域专业性和实用性。 题图 from unsplash 与通用大模型相比,垂直领域大模型具有以下…

DMBOK知识梳理for CDGA/CDGP——第一章数据管理(附常考知识点)

第一章 数据管理 第一章在 CDGA|CDGP考试中分值占比均不是很高,主要侧重点是考概念性的知识,理解数据管理的目标原则、还有与其他概念的区别点,同时掌握几个关键核心的图(车轮图、六边形图、语境关系图)。总体来说难度…

ESP32 CAM 模块和 OpenCV 的二维码扫描器

概述 该项目是关于使用 ESP32 CAM 模块和 OpenCV 设计的二维码扫描仪或阅读器。我们将使用 ESP32 摄像头模块和 python 库开发一个程序和设备,我们可以用它来扫描二维码。使用 ESP32 CAM,项目变得更便宜。 QR 码现在已经成为我们日常生活的一部分,因为我们几乎在任何地方都…

JavaScript 中如何计算代码段运行时间

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈 …

一起来学习文本怎么翻译吧

你是否曾经需要将一篇文章或一段文字翻译成另一种语言?翻译是一种非常重要的技能,它可以帮助我们更好地沟通和理解不同文化之间的差异。既然翻译这么重要,你知道文本怎么翻译才简单快捷吗?如果你还不会文本翻译的话,请…

Java实现支付宝沙箱环境支付,SDK接口远程调试

文章目录 1.测试环境2.本地配置3. 内网穿透3.1 下载安装cpolar内网穿透3.2 创建隧道 4. 测试公网访问5. 配置固定二级子域名5.1 保留一个二级子域名5.2 配置二级子域名 6. 使用固定二级子域名进行访问 转发自cpolar内网穿透的文章:Java支付宝沙箱环境支付&#xff0…

实时互动下视频 QoE 端到端轻量化网络建模

在实时视频互动中,影响观众对视频体验的有较多且复杂的因素,包括:画质、流畅度以及与其耦合的观看设备等。传统客观算法会利用网络传输或编解码参数拟合接收端人的感知体验,或者使用图像质量结合其他相关参数拟合实时视频质量。由…

chatgpt赋能python:Python[-5:-1]:一种高效且灵活的编程语言

Python[-5:-1]:一种高效且灵活的编程语言 Python被广泛应用于数据分析、机器学习、网络爬虫和自动化测试等领域。Python最新的版本是Python 3.10。 Python[-5:-1]的优点 Python[-5:-1]是Python语言中最新的版本。它的优点如下: 1.更快的性能 Python…

卡方检验Chi-square test

1.什么是卡方检验 卡方检验是一种用途很广的假设检验方法,属于非参数检验的范畴。 主要是比较两个或两个以上样本率以及两个分类变量的关联性分析。 根本思想是在于比较理论频次与实际频次的吻合程度或拟合优度问题。 分子代表了实际值与期望值的偏差,而…

.Net8顶级技术:边界检查之IR解析(二)

前言 IR技术应用在各个编程语言当中,它属于JIT的核心部分,确实有点点麻烦。但部分基本明了。本篇通过.Net8里面的边界检查的小例子了解下。前情提要,看这一篇之前建议看看前一篇:点击此处,以便于理解。 概括 1.前奏 先…

POSTGRESQL PG15关于归档的新模式

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到3群(共…

chatgpt赋能python:PythonSoup对于爬虫程序员来说为什么如此重要

Python Soup 对于爬虫程序员来说为什么如此重要 介绍 Python是现代编程世界中最广泛使用的语言之一。它是一个高级编程语言,可用于许多应用程序,从机器学习到游戏开发再到网络爬虫。对于网络爬虫,Python Soup是非常重要的工具之一。Soup是一…

如何像访问百度一样访问家里的服务器?(三)

来源:公众号【鱼鹰谈单片机】 作者:鱼鹰Osprey ID :emOsprey 在前面的两篇笔记《家里宽带搞个服务器,YYDS(一)》《家里宽带申请公网 IP(二)》,介绍了如何获取公网 IP&a…

chatgpt赋能python:Python%6简介

Python %6 简介 什么是Python %6? Python %6指的是在Python中使用%6操作符来计算一个数的余数。余数是指在进行整除时所剩余下的数字。在Python中,使用%符号来表示计算余数,因此%6表示计算一个数除以6所剩下的余数。 为什么要使用Python %…

Golang每日一练(leetDay0076) 第k大元素、组合总和III

目录 215. 数组中的第K个最大元素 Kth-largest-element-in-an-array 🌟🌟 216. 组合总和 III Combination Sum iii 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日…

13 Binder通信之ServiceManager

Binder通信之ServiceManager 一、前言 Android系统中存在很多service,当某个应用调用系统某个service的功能时,往往向系统发出请求,调用该服务的外部接口,这种外部接口我们通常叫做代理接口,也就是说要拿到目标服务需要先拿到目标服务的代理。这个时候,如果每个应用cli…