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

举报
小生凡一 发表于 2022/09/25 01:12:32 2022/09/25
【摘要】 文章目录 1. 写在前面2. 简单例子3. HOOKS4. 嵌入中间件 1. 写在前面 这次 所介绍的库是一个日志库 github.com/sirupsen/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")
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这样就可以了,我们可以看到就会打印出一条 info 语句了。
在这里插入图片描述
同样的,还可以支持 WarnErrorFatal 等等…

3. HOOKS

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

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

下图为例子

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

在这里插入图片描述

4. 嵌入中间件

  • 声明一个 log 对象
var LogrusObj *logrus.Logger

  
 
  • 1
  • 初始化日志配置

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
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 设置输出文件
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
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 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
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 用法:直接调用
LogrusObj.Infoln(err)

  
 
  • 1

文章来源: blog.csdn.net,作者:小生凡一,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_45304503/article/details/126683356

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。