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是一个日志库,具有以下特点:
地址: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可以在输出的时候输出附加信息。比如:
log.WithFields(log.Fields{
"event": event,
"topic": topic,
"key": key,
}).Fatal("Failed to send event")
这条输出会附加“event”和“topic”。另外还可以设置默认fields,每次输出都可以附加信息。
支持的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.")
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"}