日志使用
golang中使用比较多的日志包是logrus,一般为了输出日志文件及日志文件切割可以使用natefinch/lumberjack库。
logrus
github地址: github.com/sirupsen/lo…
安装库
go get github.com/sirupsen/logrus
简单使用
- 配置一个logrus实例,配置实例日志格式,将日志输出到logrus.log文件中。
package main
import (
"os"
"github.com/sirupsen/logrus"
)
func Example_basic() {
var log = logrus.New()
log.Formatter = new(logrus.JSONFormatter)
log.Formatter = new(logrus.TextFormatter) //default
log.Formatter.(*logrus.TextFormatter).DisableColors = true // remove colors
log.Formatter.(*logrus.TextFormatter).DisableTimestamp = true // remove timestamp from test output
log.Level = logrus.TraceLevel
log.Out = os.Stdout
file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666)
if err == nil {
log.Out = file
} else {
log.Info("Failed to log to file, using default stderr")
}
for i := 0; i < 10; i++ {
log.Info("test ", i)
}
- 配置fields打印不同级别的日志
logrus支持更多的日志级别:
Panic:记录日志,然后panic。Fatal:致命错误,出现错误时程序无法正常运转。输出日志后,程序退出;Error:错误日志,需要查看原因;Warn:警告信息,提醒程序员注意;Info:关键操作,核心流程的日志;Debug:一般程序中输出的调试信息;Trace:很细粒度的信息,一般用不到;
package main
import (
"os"
"github.com/sirupsen/logrus"
)
func Example_basic() {
var log = logrus.New()
log.Formatter = new(logrus.JSONFormatter)
log.Formatter = new(logrus.TextFormatter) //default
log.Formatter.(*logrus.TextFormatter).DisableColors = true // remove colors
log.Formatter.(*logrus.TextFormatter).DisableTimestamp = true // remove timestamp from test output
log.Level = logrus.TraceLevel
log.Out = os.Stdout
for i := 0; i < 10; i++ {
log.Info("test ", i)
}
defer func() {
err := recover()
if err != nil {
entry := err.(*logrus.Entry)
log.WithFields(logrus.Fields{
"omg": true,
"err_animal": entry.Data["animal"],
"err_size": entry.Data["size"],
"err_level": entry.Level,
"err_message": entry.Message,
"number": 100,
}).Error("The ice breaks!") // or use Fatal() to force the process to exit with a nonzero code
}
}()
log.WithFields(logrus.Fields{
"animal": "walrus",
"number": 0,
}).Trace("Went to the beach")
log.WithFields(logrus.Fields{
"animal": "walrus",
"number": 8,
}).Debug("Started observing beach")
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
}).Info("A group of walrus emerges from the ocean")
log.WithFields(logrus.Fields{
"omg": true,
"number": 122,
}).Warn("The group's number increased tremendously!")
log.WithFields(logrus.Fields{
"temperature": -4,
}).Debug("Temperature changes")
log.WithFields(logrus.Fields{
"animal": "orca",
"size": 9009,
}).Panic("It's over 9000!")
}
lumberjack
Golang 语言标准库的 log 包不支持日志切割,然而如果我们业务每天产生海量日志,日志文件就会越来越大,甚至会触发磁盘空间不足的报警,此时如果我们移动或者删除日志文件,需要先将业务停止写日志,很不方便。Golang 语言三方库 lumberjack 的作用就是进行日志切割,下面我们来介绍一下 lumberjack。
安装库
go get -u github.com/natefinch/lumberjack
导入库
import "gopkg.in/natefinch/lumberjack.v2"
使用
将 lumberjack 与标准库的 log 包一起使用,只需在应用程序启动时将它传递到 SetOutput 函数。
log.SetOutput(&Logger{
Filename: "/var/log/myapp/foo.log",
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, // days
Compress: true, // disabled by default
})
lumberjack 的 Logger 结构体,是一个写入指定文件的 io.WriteCloser。Logger 在第一次写入时打开或创建日志文件。如果文件存在且小于 MaxSize 的值,lumberjack 将打开并追加到该文件。如果文件存在且其 size 的值为大于等于 MaxSize,文件通过将当前时间作为文件名的一部分进行重命名文件,然后使用原始文件名创建新的日志文件。
每当写入会导致当前日志文件超过 MaxSize 的值时,当前文件将关闭和重命名,并且使用原始名称创建的新日志文件。因此,Logger 的文件名始终是当前日志文件。
备份使用给定给 Logger 的日志文件名,其中名称是没有扩展名的文件名,时间戳是日志与时间一起旋转的时间。时间格式是 2006-01-02T15-04-05.000,扩展是原始扩展。例如,如果您的 Logger.Filename 是 /var/log/foo/server.log,那么 2016 年 11 月 11 日下午 6:30 创建的备份将使用 filenam 是 /var/log/foo/server-2016-11-04T18-30-00.000.log