logrus包学习(一)

个人学习记录,写下来备用

logrus是golang的结构化日志包

一、创建一个实例

logger := logrus.New()

当然你也可以直接使用,我个人习惯实例化一下

二、设置格式

个人习惯使用json

logger.SetFormatter(&logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05", //设置一下时间格式// PrettyPrint:     true,//是否开启漂亮化打印,就是是否开启json结果的indent// DisableHTMLEscape: true,//默认会对信息进行htmlescape// DisableTimestamp: true,//默认会对所有的时间变成TimestampFormat的情况a})

TimestampFormat选项是日期格式化方式,除了自带的time字段之外,你输入的所有时间也会用这个格式化

DisableTimestamp选项可以取消时间格式化的行为,写个例子

logger.Error(time.Now())
//不对时间进行fomat的结果{"level":"error","msg":"2024-03-18 21:21:34.8120041 +0800 CST m=+0.000000001"}

 PrettyPrint选项控制是否对json进行indent(类似如下格式),就是美观一点,没什么必要我觉得

{"name":"xxx","age":xxx,
}

DisableHTMLEscape这个选项控制是否进行HTMLEscape,设置为false的话就会特定符号进行转译

logger.Error(";dada&")
不进行htmlescape的结果{"level":"error","msg":";dada\u0026","time":"2024-03-18 21:12:34"}

还有一些配置,俺暂时没有看懂 

三、日志级别和设置

一共七个级别

TraceLevel->DebugLevel->InfoLevel->WarnLevel->ErrorLevel->FatalLevel->PanicLevel

panic级别最大,频繁的panic确实比fatal更可怕,应该意味着逻辑上面有较大的问题

我们使用SetLevel方法来设置日志级别

logger.SetLevel(logrus.ErrorLevel)
logger.Infoln("hh") //不会显示
logger.Errorln("hhh")

在上面的例子中只有“>=ErrorLevel”的日志会被输出,logger.Infoln()这样的日志就记录不下来,另外需要注意,即使SetLevel时设置PanicLevel,任何FatalLevel的日志任然会退出程序

四、设置输出源

默认日志是输出到os.StdOut的

	logfile, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)logger.SetOutput(io.MultiWriter(logfile, os.Stdout))

上面的写法可以即输出到./test.log,又输出到控制台

五、追踪log所在的函数、包名和行数

logger.SetReportCaller(true) //打印出错的函数名、文件名、行数等相关信息

会生成这样的一个类似日志,把你打印日志的函数、包名和行数给出来

{"file":"D:/develop/golang/logrus_learn/main.go:67","func":"main.main","hobby":"gaming","level":"error","msg":"HHHH","name":"huanfeng","time":"2024-03-19 21:23:40"}

六、默认字段

我尝试了一下在日志中打印一个结构体

logger.Errorln(Person{Name: "黄烽",Age:  19,})

结果打印出来的是这样一个形式

{"file":"D:/develop/golang/logrus_learn/main.go:56","func":"main.main","level":"error","msg":"{黄烽 19}","time":"2024-03-19 21:10:49"}

但是可以看到msg字段部分不是一个结构体。我们可以用如下的方式去给日志加上新的字段

logger.WithFields(logrus.Fields{"name":  "huanfeng","hobby": "gaming",}).Errorln("HHHH")

打印出来就是如下的格式,多了name和hobby字段

{"file":"D:/develop/golang/logrus_learn/main.go:67","func":"main.main","hobby":"gaming","level":"error","msg":"HHHH","name":"huanfeng","time":"2024-03-19 21:23:40"}

此外细心的朋友可以看出来了,WithFields返回的也是一个logger实例,因此可以有以下的写法

myLogger:=logger.WithFields(logrus.Fields{"name":  "huanfeng","hobby": "gaming",})
myLogger.Infoln("hhhh")

形成一个带默认字段的效果

七、fatal行为的生命周期

fatal级别的行为会退出整个程序,有时候希望在这个生命周期干点事,可以这样写

logrus.RegisterExitHandler(func() {fmt.Println("做一些退出的准备工作") //这个函数不能挂载在实例上})// 写多个钩子也没事logrus.RegisterExitHandler(func() {fmt.Println("再做一些退出的准备工作") //钩子确实是在退出之前运行的})logger.Fatalln("fatal")logger.Errorln("你不会见到这个日志")

几个注意点,fatal级别日志之后的日志不会记录,RegisterExitHandler可以注册多个,RegisterExitHandler方法不能挂载在实例上,只能写在logrus默认实例上

以上就是基础的学习,下一次学一下日志钩子。

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

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

相关文章

echart多折线图堆叠 y轴和实际数据不对应

当使用 ECharts 绘制堆叠折线图时,有时会遇到 y 轴与实际数据不对应的问题。 比如明明值是50,但折线点在y轴的对应点却飙升到了二百多 解决办法: 查看了前端代码发现在echart的图表中有一个‘stack’的属性,尝试把他删除之后y轴的…

2020.9.8C++Primer学习笔记————模板函数

CPrimer学习笔记————模板函数 看CPrimer看到了第十章函数模板部分,其中提到了模板函数用法,帮助强类型语言减少简单方法的代码量。 C是强类型语言,在调用方法时需要对传参有严格的判断,例如实现一个简单的大小判断方法时&am…

算法体系-11 第十一节:二叉树基本算法(上)

一 两链表相交 1.1 题目描述 给定两个可能有环也可能无环的单链表,头节点head1和head2。请实现一个函数,如果两个链表相交,请返回相交的 第一个节点。如果不相交,返回null 【要求】 如果两个链表长度之和为N,时间复杂…

静电无处不在:揭秘液晶显示屏静电防护的“大师级“策略

静电,仿佛是电子产品制造过程中的隐形杀手,尤其对于液晶显示屏等精密电子元器件的影响更是不可小觑。然而,面对这一挑战,有些制造商采取了一系列超越寻常的静电防护措施。今天,我们将揭开他们的"大师级"策略…

利用Android studio 查看模拟器中数据文件

打开Android studio ,然后按照下图选择 然后会在右侧打开一个这样子的管理弹窗 找到 data/data/your project file 你的缓存跟下载的文件就都在里面了

【C++】每日一题 219 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int…

BigDecimal保留两位小数失败问题

文章目录 背景问题解决如何测试代码 背景 测试时发现在线swagger测试会自动处理BigDecimal小数点后面的数字,就是有零的会都给你去掉,比如9.000与9.500到最后都会被swagger处理成9跟9.5。使用postman测是最准的,测出来的就是9.000跟9.500。 …

数据库基本内容与安装MySQL数据库

目录 一.数据库基本内容 1.数据 (1)描述事物的符号记录 (2)包括数字,文字、图形、图像、声音、档案记录等 (3)以“记录”形式按统一的格式进行存储 2.表 (1)将不同…

Java SE 22 新增特性

Java SE 22 新增特性 作者:Grey 原文地址: 博客园:Java SE 22 新增特性 CSDN:Java SE 22 新增特性 源码 源仓库: Github:java_new_features 使用未命名的变量和模式 我们经常需要定义一些我们根本不需要的变量…

【Linux】基础 IO(动静态库)-- 详解

一、前言 为什么要使用别人的代码? 主要是为了提高程序开发的效率和程序的健壮性。 当别人把功能都实现了,然后我们再基于别人的代码去做二次开发,那么效率当然就提高了。其次,这里基于的别人当然不是随便找的一个人,…

[Qt学习笔记]Qt鼠标事件mouseMoveEvent实时获取图像的坐标和像素值

目录 1、介绍2、效果展示3、实现过程3.1 图像的加载和显示3.2 设置鼠标跟踪事件激活3.3 实现代码 4、源码展示 1、介绍 上一篇介绍了使用OpenCV的setMouseCallback回调函数实现获取鼠标点击点的图像坐标和像素值,本篇使用鼠标事件mouseMoveEvent函数来实现实时获取…

OPPO 后端二面,凉凉。。。

美众议院通过 TikTok 法案 之前我们讲了 老美要求字节跳动在 165 天内剥离短视频应用 TikTok,当时的最新进度是 TikTok 给 1.7 亿美国用户发弹窗,发动用户群众给国会打电话进行抗议。 但显然这点力度的抗议并不会造成什么实质影响。 昨晚,美国…

精读《useRef 与 createRef 的区别》

1 引言 useRef 是常用的 API,但还有一个 createRef 的 API,你知道他们的区别吗?通过 React.useRef and React.createRef: The Difference 这篇文章,你可以了解到何时该使用它们。 2 概述 其实原文就阐述了这样一个事实&#xf…

【EDSR】《Enhanced Deep Residual Networks for Single Image Super-Resolution》

CVPR workshops-2017 首尔大学 code: https://github.com/limbee/NTIRE2017/tree/masterhttps://github.com/sanghyun-son/EDSR-PyTorch 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Residual blocks4.2 Single…

华为OD机试 - 单向链表中间节点(Java JS Python C C++)

题目描述 给定一个单链表 L,请编写程序输出 L 中间结点保存的数据。 如果有两个中间结点,则输出第二个中间结点保存的数据。例如: 给定 L 为 1→7→5,则输出应该为7; 给定 L 为 1→2→3→4,则输出应该为…

盘点国内IP地址服务的功能及提供商

随着互联网的快速发展和普及,IP地址服务提供商在中国市场扮演着越来越重要的角色。这些代理软件提供商不仅为用户提供稳定的网络连接,还可以帮助用户实现IP地址切换、绕过地理限制等功能。虎观代理接下来将详解国内IP地址服务的主要功能,并对…

王道c语言-chap13 栈实例

王道c语言-chap13 栈实例 #include <iostream>#define END -1 #define MaxSize 50typedef int ElemType; typedef struct {int data[MaxSize];int top; } SqStack;void InitStack(SqStack &s) {s.top-1; }void PrinfSqStack(SqStack s) {for (int i 0; i < s.to…

什么是布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种概率型数据结构&#xff0c;用于判断一个元素是否存在于一个集合中。它的主要优点是占用空间少、查询速度快&#xff0c;并且支持高效的插入和查询操作。 布隆过滤器由一个位数组和多个哈希函数构成。初始时&#xff0c;…

八股文三(Spring、Spring Cloud Alibaba)

Spring篇 什么是Spring Spring是个轻量级的框架&#xff0c;他有两大内核分别是IOC、AOPIOC是什么 * 依赖注入和控制反转&#xff0c;它是一种思想&#xff0c;创建对象不是直接new出来&#xff0c;而是交给IOC容器&#xff0c;由容器去创建进行管理&#xff0c;这就是控制反…

解决antd vue 的table列表过宅内容换行和过长有空白列的问题

主要有两个注意点 1、columns数组中保留一个对象不设置宽度&#xff0c;其余都要设置宽度&#xff1b; 2、HTML中scroll要设置为{x: 足够长的固定宽度}&#xff1b; 具体代码如下&#xff1a; <a-tableref"table"size"middle"rowKey"rowSerial&qu…