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默认实例上

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

相关推荐

  1. logrus学习

    2024-03-20 05:54:03       20 阅读
  2. golang 集成logrus日志框架

    2024-03-20 05:54:03       38 阅读
  3. 学习python仅收藏此篇就够了(闭,装饰器)

    2024-03-20 05:54:03       39 阅读
  4. Golang bytes 学习

    2024-03-20 05:54:03       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 05:54:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 05:54:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 05:54:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 05:54:03       20 阅读

热门阅读

  1. cuda从入门到精通(五)CUDA实现AI模型中的softmax

    2024-03-20 05:54:03       21 阅读
  2. C--动态规划

    2024-03-20 05:54:03       18 阅读
  3. XR虚拟拍摄:短剧制作的新宠

    2024-03-20 05:54:03       21 阅读
  4. ARM day4 代码

    2024-03-20 05:54:03       17 阅读
  5. 富格林:揭露黑幕套路安全规避风险

    2024-03-20 05:54:03       20 阅读
  6. 认识DDR3

    2024-03-20 05:54:03       16 阅读
  7. 蓝桥杯-带分数

    2024-03-20 05:54:03       21 阅读
  8. (保姆级)离线安装mongoDB集群

    2024-03-20 05:54:03       18 阅读
  9. 实时数仓的另一种构建方法starRocks的物化视图

    2024-03-20 05:54:03       17 阅读
  10. 音视频实战--音视频编码

    2024-03-20 05:54:03       20 阅读