• logrus包学习(一)


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

    logrus是golang的结构化日志包

    一、创建一个实例

    logger := logrus.New()

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

    二、设置格式

    个人习惯使用json

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

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

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

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

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

    1. {
    2. "name":"xxx",
    3. "age":xxx,
    4. }

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

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

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

    三、日志级别和设置

    一共七个级别

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

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

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

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

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

    四、设置输出源

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

    1. logfile, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)
    2. 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"}

    六、默认字段

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

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

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

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

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

    1. logger.WithFields(logrus.Fields{
    2. "name": "huanfeng",
    3. "hobby": "gaming",
    4. }).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实例,因此可以有以下的写法

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

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

    七、fatal行为的生命周期

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

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

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

    以上就是基础的学习,钩子部分我现在还没写到,将来要配合一些东西去写,这里贴一下官网给的一些钩子的地址,Hooks · sirupsen/logrus Wiki · GitHub

  • 相关阅读:
    JavaScript:实现AvlTree树算法(附完整源码)
    梦开始的地方——C语言文件操作详解
    token正确不报错,token失效后却出现报跨域错误
    CFCA企业版通配符SSL证书
    阿里云云原生一体化数仓 — 离线实时一体化新能力解读
    大数据-Hadoop-基础篇-第二章-介绍
    2022卡塔尔世界杯小组赛出线形势分析指南——德国队会被西班牙做掉吗?
    java应用提速(速度与激情)
    京东云开发者|经典同态加密算法Paillier解读 - 原理、实现和应用
    docker(3) dockerCompose
  • 原文地址:https://blog.csdn.net/huangfengnt/article/details/136857232