在一个 web 项目中,日志打印功能是必须的,有了详细的日志能为问题排查带来很大的便利。Golang 有很多开源的日志包可供使用,这里我还是使用非常流行的 logrus 包,结合 file-rotatelogs 包实现日志的自动切割轮转。
集成方法:
1.单独定义一个 package 名为 logger,里面只有一个 init.go 文件,初始化日志配置,这个配置是全局的:
- 日志输出格式为 json;
- 日志自动轮转,保留最近 7 天日志,一天产生一个日志文件,防止服务长时间运行占用系统过多的磁盘资源;
日志在输出到文件的同时并打到 stdout;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43package logger
import (
"io"
"os"
"path"
"time"
log "github.com/sirupsen/logrus"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/demo/pkg/common/config"
"github.com/demo/pkg/utils/fs"
)
// 全局日志配置初始化
// 1.日志同时输出到到文件和标准输出;
// 2.保留最近 7 天日志,一天一个日志文件;
//
func init() {
logDir := config.GetConfig().GetString("log_dir")
if !fs.PathExists(logDir) {
if err := os.MkdirAll(logDir, 0755); err != nil {
panic(err)
}
}
logfile := path.Join(logDir, "app")
fsWriter, err := rotatelogs.New(
logfile+"_%Y-%m-%d.log",
rotatelogs.WithMaxAge(time.Duration(168)*time.Hour),
rotatelogs.WithRotationTime(time.Duration(24)*time.Hour),
)
if err != nil {
panic(err)
}
multiWriter := io.MultiWriter(fsWriter, os.Stdout)
log.SetReportCaller(true)
log.SetFormatter(&log.JSONFormatter{})
log.SetOutput(multiWriter)
log.SetLevel(log.InfoLevel)
}
2.在项目入口 main 包引入该包,初始化全局日志配置
1
2
3
4package main
import (
_ "github.com/demo/pkg/logger" // 引入包时自动执行了 logger 包的 init 函数完成了日志初始化配置
)3.至此,在项目其他地方如果要打印日志,直接引用 logrus 包即可,在 main 包中已经完成了日志配置,无需在其他使用的地方再次初始化配置;
1
2
3
4
5
6
7
8
9package hello
import (
log "github.com/sirupsen/logrus"
)
func HelloLog() {
log.Info("HelloLog func called")
}