Go Web实战-3.集成Logrus

Gin自带了logger,可以输出到文件。不过为了更好的管理日志,以及后面的集中采集,这里引入了logrus。

先看看Gin的log,官方代码,比较简单。

func main() {
    // 关闭打印的字体颜色。到文件里面不需要颜色
    gin.DisableConsoleColor()

    // 输出到文件
    f, _ := os.Create("gin.log")
    gin.DefaultWriter = io.MultiWriter(f)

    // 可以在文件和控制台同时输出
    // gin.DefaultWriter = io.MultiWriter(f, os.Stdout)

    router := gin.Default()
    router.GET("/ping", func(c *gin.Context) {
        c.String(200, "pong")
    })

    router.Run(":8080")
}
Logrus

logrus是一个日志库,具有以下特点:

  • 结构化
  • 支持Field,可以输出附加信息
  • 兼容golang原生log
  • 支持TEXT和JSON
  • 支持Hook,这个特别强大
安装

地址:https://github.com/sirupsen/logrus

go get github.com/sirupsen/logrus

输出格式

    支持TEXT和JSON。

TEXT格式如下:

time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8
time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10

另外使用TEXT格式时,如果控制台是TTY可以带颜色,不过我用goland没有成功,可能哪里还有点问题。Gin的输出是带颜色的。

Json格式:

{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the
ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"}
Fields

使用fields可以在输出的时候输出附加信息。比如:

log.WithFields(log.Fields{
  "event": event,
  "topic": topic,
  "key": key,
}).Fatal("Failed to send event")

这条输出会附加“event”和“topic”。另外还可以设置默认fields,每次输出都可以附加信息。

Level

支持的level比官方的print,panic,fatal更多

log.Debug("Useful debugging information.")
log.Info("Something noteworthy happened!")
log.Warn("You should probably take a look at this.")
log.Error("Something failed but I'm not quitting.")
// Calls os.Exit(1) after logging
log.Fatal("Bye.")
// Calls panic() after logging
log.Panic("I'm bailing.")
Hook

logrus提供的钩子非常强大,并且提供了非常多的插件。可以直接用到采集日志上,输出到文件、redis、mysql、各种数据库都有的。

使用

主要集成logrus,然后根据运行使用不同配置。debug环境输出到stdout,release环境输出到文件,并按日期做一下切分。

首先get一下logrus。为了更简单的使用和配置logrus,在get一个插件 go get github.com/gogap/logrus_mate

这个插件主要是为了方便配置logrus,支持从文件直接读取配置,比我们自己去加载配置更方便。

使用比较简单,首先写好配置文件,使用conf格式:

debug {

        level = "debug"

        formatter.name = "text"
        formatter.options  {
                            force-colors      = false
                            disable-colors    = false
                            disable-timestamp = false
                            full-timestamp    = false
                            timestamp-format  = "2006-01-02 15:04:05"
                            disable-sorting   = false
        }

}

release {

        level = "debug"

        out.name = "rotatelogs"
        out.options {
                    path =  logs/release/history/%Y%m%d.log
                    #clock=
                    #location=
                    link-name= logs/release/current.log
                    #rotation-time=   #default 24hour
                    #max-age=         #default 24hour * 7
        }

        formatter.name = "json"
        formatter.options  {
                            force-colors      = false
                            disable-colors    = false
                            disable-timestamp = false
                            full-timestamp    = false
                            timestamp-format  = "2006-01-02 15:04:05"
                            disable-sorting   = false
        }


}

这里配置了两个logger,分别用于不同环境。level是输出的级别。

debug就是直接输出到stdout,release下使用了第三方writter来写入日志。rotatelogs 用来日志持久化和切分。没有使用hook,使用file和lfshook都要可以保存到文件。

go get github.com/lestrrat-go/file-rotatelogs

配置:

    pattern :格式化输入保存文件名,例如:

rotatelogs.New("/var/log/myapp/log.%Y%m%d")

   clock:时区

   location:地区

   link-name:创建连接到保存的log

   rotationtime:文件之间的保存间隔,logrus-mate默认24小时

   maxage:日志过期清除的时间,logrus-mate默认7天

程序:

import (
	_ "github.com/gogap/logrus_mate/hooks/lfshook"
	_ "github.com/gogap/logrus_mate/writers/rotatelogs"
	"github.com/spf13/viper"
	"github.com/gogap/logrus_mate"
	"github.com/sirupsen/logrus"
	"fmt"
)

type LogParam struct {
}

func (p *LogParam) ReadConfig(v *viper.Viper) {
	var mode = v.GetString("application.mode")
	// 根据应用环境加载相应的log配置
	mate, err := logrus_mate.NewLogrusMate(logrus_mate.ConfigFile("config/yml/log.conf"))
	//注入lorus的标准logger
	if err = mate.Hijack(logrus.StandardLogger(), mode); err != nil {
		fmt.Println(err)
		return
	}
	//使用
	logrus.Debug("LogParam Read Suc")
}

程序比较简单,直接加载配置,然后根据环境选择对应的logger注入到logrus。

要注意的是不管使用的第三方hook还是自己写的hook,记得import初始化它。

然后使用,输出到文件。

{"level":"debug","msg":"LogParam Read Suc","time":"2018-04-26T16:14:09+08:00"}
{"level":"debug","msg":"AppParam Read Suc","param":{"Mode":"release","Port":":8080"},"time":"2018-04-26T16:14:09+08:00"}
{"level":"debug","msg":"DbParam Read Suc","param":{"Cnt":2,"Source":{"admin":{"Dialect":"mysql","Url":"jdbc:mysql://localhost:3306/base_admin?allowMultiQueries=true\u0026useUnicode=true\u0026characterEncoding=UTF-8\u0026useSSL=true","Username":"root","Password":"root","MaxIdle":200,"MaxOpen":50},"user":{"Dialect":"mysql","Url":"jdbc:mysql://localhost:3306/base_user?allowMultiQueries=true\u0026useUnicode=true\u0026characterEncoding=UTF-8\u0026useSSL=true","Username":"root","Password":"root","MaxIdle":200,"MaxOpen":50}}},"time":"2018-04-26T16:14:09+08:00"}
{"level":"info","msg":"Config Read  Over","time":"2018-04-26T16:14:09+08:00"}
{"level":"info","msg":"Server Starting...","time":"2018-04-26T16:14:10+08:00"}
{"level":"debug","msg":"LogParam Read Suc","time":"2018-04-26T16:15:31+08:00"}



    

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值