0
点赞
收藏
分享

微信扫一扫

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


文章目录

  • ​​1. 写在前面​​
  • ​​2. 简单例子​​
  • ​​3. HOOKS​​
  • ​​4. 嵌入中间件​​

1. 写在前面

这次 所介绍的库是一个日志库 ​github.com/sirupsen/logrus

2. 简单例子

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

package main

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

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

这样就可以了,我们可以看到就会打印出一条 ​​info​​ 语句了。

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


同样的,还可以支持 ​​Warn​​​、​​Error​​​、​​Fatal​​ 等等…

3. HOOKS

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

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

下图为例子

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

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

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)


举报

相关推荐

0 条评论