准备工作
日志记录对程序排查问题比较关键,记录下GO中日志选择,从以下出发点考虑:
- 日志文件能自动切割,以免过大
- 能记录从哪个文件哪行代码调用的,方便排查问题
- 配置简单明了
- 库文件使用人数较多,稳定
经过一段时间摸索,最终选择了
Logrus
和lumberjack
两个库,使用人数都比较多。
安装两个库
go get gopkg.in/natefinch/lumberjack.v2
go get github.com/sirupsen/logrus
代码
实际中一行配置就可以完成,后续只用调用
logrus.Debug
、logrus.Info
同标准库一样只用log
改为logrus
十分简单明了
logrus.SetOutput(io.MultiWriter(os.Stdout, &lumberjack.Logger{
Filename: "go-log.log",
MaxBackups: 10,
MaxSize: 20,
}))
整体代码如下,基本能满足实际使用需求
个别需求调整可以参考这两个文档
package main
import (
"io"
"os"
"time"
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 同时输出到终端和文件
logrus.SetOutput(io.MultiWriter(os.Stdout, &lumberjack.Logger{
Filename: "go-log.log",
MaxBackups: 10,
MaxSize: 20,
}))
/*只输出到文件的话只用以下写法
logrus.SetOutput(&lumberjack.Logger{
Filename: "go-log.log",
MaxBackups: 10,
MaxSize: 20,
})
*/
// 这个在日志中记录代码位置,十分有用
logrus.SetReportCaller(true)
// 设置输出等级,按实际需求设置,可以忽略
logrus.SetLevel(logrus.InfoLevel)
logrus.Debug("debug message")
logrus.Infof("info message at %s\n", time.Now().Format("2006-01-02 15:04:05"))
logrus.Error("error message")
}
使用效果
logrus.SetReportCaller(true)
可以自动在日志当中记录代码调用位置,设置为false时候不开启