个人学习记录,写下来备用
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,又输出到控制台
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级别的行为会退出整个程序,有时候希望在这个生命周期干点事,可以这样写
- logrus.RegisterExitHandler(func() {
- fmt.Println("做一些退出的准备工作") //这个函数不能挂载在实例上
- })
- // 写多个钩子也没事
- logrus.RegisterExitHandler(func() {
- fmt.Println("再做一些退出的准备工作") //钩子确实是在退出之前运行的
- })
- logger.Fatalln("fatal")
- logger.Errorln("你不会见到这个日志")
几个注意点,fatal级别日志之后的日志不会记录,RegisterExitHandler可以注册多个,RegisterExitHandler方法不能挂载在实例上,只能写在logrus默认实例上
以上就是基础的学习,钩子部分我现在还没写到,将来要配合一些东西去写,这里贴一下官网给的一些钩子的地址,Hooks · sirupsen/logrus Wiki · GitHub。