Go 日志库logrus写入文件简单使用

logrus

logrus是目前github上star最多的一个go语言日志库,完全兼容go标准库日志模块,可以方便的替换整个项目,这里记录下logrus的简单使用方法。

简单用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
log "github.com/sirupsen/logrus"
)

func main() {
// 设置日志格式为json格式,默认为TextFormatter
log.SetFormatter(&log.JSONFormatter{})

// 日志消息输出可以是任意的io.writer类型
log.SetOutput(os.Stdout)

// 设置日志级别为warn以上
// log.SetLevel(log.WarnLevel)

log.WithFields(log.Fields{
"userID": 1,
"api":"login"
"req":"xxxxxx",
}).Info("a login request")
}

logrus提倡结构话日志记录,使用WithFields可以方便的结构化日志数据。

lfshook

lfshook是一个方便开发人员使用logrus写入文件系统的一个hook,能够快速的配置logrus。

一般用法

比较简单,直接上代码,一目了然:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var Log *logrus.Logger
func NewLogger() *logrus.Logger {
if Log != nil {
return Log
}

pathMap := lfshook.PathMap{
logrus.InfoLevel: "./info.log",
logrus.PanicLevel: "./panic.log",
}

Log = logrus.New()

Log.Hooks.Add(lfshook.NewHook(pathMap, &logrus.JSONFormatter{}))

return Log
}
  • 这种方法将日志写入指定文件,但是通常为了避免日志文件过大,方便查看,我们需要将日志文件进行分割,下面使用file-rotatelogs来实现。

file-rotatelogs

file-rotatelogs提供一个文件轮换io.Writer,配合logrus实现日志分割。

使用方法

还是直接上代码了

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
var Log *logrus.Logger
func NewLoggerWithRotate() *logrus.Logger {
if Log != nil {
return Log
}

path := "./test.log"
writer, _ := rotatelogs.New(
path+".%Y%m%d%H%M",
rotatelogs.WithLinkName(path), // 生成软链,指向最新日志文件
rotatelogs.WithMaxAge(60*time.Second), // 文件最大保存时间
rotatelogs.WithRotationTime(20*time.Second), // 日志切割时间间隔
)

pathMap := lfshook.WriterMap{
logrus.InfoLevel: writer,
logrus.PanicLevel: writer,
}

Log = logrus.New()
Log.Hooks.Add(lfshook.NewHook(
pathMap,
&logrus.JSONFormatter{},
))

return Log
}