zoukankan      html  css  js  c++  java
  • 【Go】go的日志框架-logrus初探

    summary

     logrus是针对go语言开发的一款日志系统,在本片文章中,将会对上手logrus的过程中遇到的一些问题做一个记录。这个记录参考了这篇文章。下面我们开始吧!

    上手

    package main
    
    import (
      log "github.com/sirupsen/logrus"
    )
    
    func main() {
      log.WithFields(log.Fields{
        "animal": "walrus",
      }).Info("A walrus appears")
    }

    这样就可以啦,可以看到输出的日志格式如下:

    time="2018-08-11T15:42:22+08:00" level=info msg="A walrus appears" animal=walrus
    

    那么接下来的问题是,以这种方式输出的日志可以看到就还是比较杂乱无章的,那么有没有方式把日志用一种比较有格式的方式输出呢?我们想到了JSON格式。那么下面我们用

    log.SetFormatter(&log.JSONFormatter{})

    这条语句,以JSON格式来输出我们的日志:

    package main
    
    import (
    	"os"
    	log "github.com/sirupsen/logrus"
    )
    
    func init() {
    	// 设置日志格式为json格式
    	log.SetFormatter(&log.JSONFormatter{})
    
    	// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
    	// 日志消息输出可以是任意的io.writer类型
    	log.SetOutput(os.Stdout)
    
    	// 设置日志级别为warn以上
    	log.SetLevel(log.WarnLevel)
    }
    
    func main() {
    	log.WithFields(log.Fields{
    		"animal": "walrus",
    		"size":   10,
    	}).Info("A group of walrus emerges from the ocean")
    
    	log.WithFields(log.Fields{
    		"omg":    true,
    		"number": 122,
    	}).Warn("The group's number increased tremendously!")
    
    	log.WithFields(log.Fields{
    		"omg":    true,
    		"number": 100,
    	}).Fatal("The ice breaks!")
    }  

    输出对应如下:

    {"level":"warning","msg":"The group's number increased tremendously!","number":122,"omg":true,"time":"2019-11-13T17:32:42+08:00"}
    {"level":"fatal","msg":"The ice breaks!","number":100,"omg":true,"time":"2019-11-13T17:32:42+08:00"}  

    除了setFormatter用于把日志的格式设置为JSON之外,我们在这里还设置了显示日志的级别。

    并可以看到,每次在withField之后加上一种输出日志的格式之后就可以输出一行日志了。

    深入 

    有时我们也需要在程序的不同部分中,向日志中不断加入信息,并在程序的最后进行输出,下面提供一种使用logger的办法:

    logger:= log.WithFields(log.Fields{
    		"path":       r.URL.Path,
    		"method":     r.Method,
    		"request_id": reqID,
    		"client_ip":  r.RemoteAddr,
    		"start_time": startTime,
    	})
    
    logger = logger.WithFields(log.Fields{
    			"error": err.Error(),
    		})
    
    logger.WithFields(log.Fields{
    		"error_code": aErr.Code,
    		"error_msg":  aErr.Msg,
    	}).Warn("FAIL")
    

    如图,用这种办法就可以在程序的各个部分中向同一段log中加入所需要的内容了。下面所需要做的就是吧logger作为一个参数在各个需要进行输出log的函数中传播了。

  • 相关阅读:
    《ASP.NET2.0揭秘》读书笔记——构建组合控件
    《ASP.NET2.0揭秘》读书笔记——构建自定义控件前你必须思考的两个问题
    《ASP.NET2.0揭秘》读书笔记——构建混合控件
    jQuery.bind事件 详解
    High Performance JavaScript(高性能JavaScript)读书笔记
    HTML5 新标签总汇
    前端攻略系列(三) javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
    node.js 初体验
    Fiddler 前端开发值得拥有
    JavaScript实现 页面滚动图片加载
  • 原文地址:https://www.cnblogs.com/Ryan16231112/p/11850990.html
Copyright © 2011-2022 走看看