个人学习记录,写下来备用
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默认实例上
以上就是基础的学习,下一次学一下日志钩子。