快捷搜索: 王者荣耀 脱发

【Go开源宝藏】十分强大的日志库 logrus

1. 写在前面

这次 所介绍的库是一个日志库 github.com/sirupsen/logrus ,是我们在web开发中,经常需要的库,因为我们的应用部署到线上出现问题的话,就需要用日志来进行排查。

2. 简单例子

其实日志库用起来是很简单的,就和我们平时使用的 fmt.Println() 是类似的,所以我们只需要将这个

package main

import (
  log "github.com/sirupsen/logrus"
)

func main() {
          
   
  log.WithFields(log.Fields{
          
   
    "animal": "walrus",
  }).Info("A walrus appears")
}

这样就可以了,我们可以看到就会打印出一条 info 语句了。 同样的,还可以支持 Warn、Error、Fatal 等等…

3. HOOKS

同样的我们也可以直接使用 hooks 去构建我们体系。 比如ELK体系之类的。

加一个钩子就可以形成一套体系了。

下图为例子

日志会异步加载到ES,然后我们可以通过kibana进行快速搜索定位故障

4. 嵌入中间件

    声明一个 log 对象
var LogrusObj *logrus.Logger
    初始化日志配置
func init() {
          
   
	if LogrusObj != nil {
          
   
		src, _ := setOutputFile()
		//设置输出
		LogrusObj.Out = src
		return
	}
	//实例化
	logger := logrus.New()
	src, _ := setOutputFile()
	//设置输出
	logger.Out = src
	//设置日志级别
	logger.SetLevel(logrus.DebugLevel)
	//设置日志格式
	logger.SetFormatter(&logrus.TextFormatter{
          
   
		TimestampFormat: "2006-01-02 15:04:05",
	})
	/*
	加个hook形成ELK体系
	*/
	hook := model.EsHookLog()
	logger.AddHook(hook)
	LogrusObj = logger
}
    设置输出文件
func setOutputFile() (*os.File, error) {
          
   
	now := time.Now()
	logFilePath := ""
	if dir, err := os.Getwd(); err == nil {
          
   
		logFilePath = dir + "/logs/"
	}
	_, err := os.Stat(logFilePath)
	if os.IsNotExist(err) {
          
   
		if err := os.MkdirAll(logFilePath, 0777); err != nil {
          
   
			log.Println(err.Error())
			return nil, err
		}
	}
	logFileName := now.Format("2006-01-02") + ".log"
	//日志文件
	fileName := path.Join(logFilePath, logFileName)
	if _, err := os.Stat(fileName); err != nil {
          
   
		if _, err := os.Create(fileName); err != nil {
          
   
			log.Println(err.Error())
			return nil, err
		}
	}
	//写入文件
	src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
	if err != nil {
          
   
		log.Println(err)
		return nil, err
	}
	return src, nil
}
    ES 配置
func EsHookLog() *elogrus.ElasticHook {
          
   
	fmt.Println(EsClient)
	hook, err := elogrus.NewElasticHook(EsClient, esHost, logrus.DebugLevel, esIndex)
	fmt.Println("hook", hook)
	if err != nil {
          
   
		log.Panic(err)
	}
	return hook
}
    用法:直接调用
LogrusObj.Infoln(err)
经验分享 程序员 微信小程序 职场和发展