文章目录
- 1.logrus 是什么?
- 2.logrus 快速上手
- 3.logrus 实现日志滚动
- 4.一个完整的示例
- 5.小结
- 参考文献
1.logrus 是什么?
logrus 是一款功能强大的 Golang 日志库,具有非常灵活的配置选项。它支持多种日志级别、格式和输出方式,包括 JSON 格式的输出、syslog 输出等等。logrus 也可以通过 Hooks 实现日志的异步输出和处理。
2.logrus 快速上手
1.安装 logrus
使用 go get命令安装 logrus:
代码语言:javascript复制go get github.com/sirupsen/logrus
2.创建一个 Logger 对象
在程序中引入logrus包,并创建一个Logger对象:
代码语言:javascript复制import "github.com/sirupsen/logrus"
var log = logrus.New()
当然,你也可以使用全局缺省的 Logger 对象 std。其定义如下:
代码语言:javascript复制var (
// std is the name of the standard logger in stdlib `log`
std = New()
)
// Creates a new logger. Configuration should be set by changing `Formatter`,
// `Out` and `Hooks` directly on the default logger instance. You can also just
// instantiate your own:
//
// var log = &logrus.Logger{
// Out: os.Stderr,
// Formatter: new(logrus.TextFormatter),
// Hooks: make(logrus.LevelHooks),
// Level: logrus.DebugLevel,
// }
//
// It's recommended to make this a global instance called `log`.
func New() *Logger {
return &Logger{
Out: os.Stderr,
Formatter: new(TextFormatter),
Hooks: make(LevelHooks),
Level: InfoLevel,
ExitFunc: os.Exit,
ReportCaller: false,
}
}
3.配置 Logger 对象
可以通过 Logger 对象的方法来配置 Logger,例如设置日志输出格式、设置日志级别等等。以下是一个例子:
代码语言:javascript复制log.SetFormatter(&logrus.TextFormatter{})
log.SetLevel(logrus.DebugLevel)
4.打印日志
可以使用 Logger 对象的方法来打印日志,例如:
代码语言:javascript复制log.Info("This is an info log.")
log.Warn("This is a warning log.")
log.Error("This is an error log.")
可以通过不同的方法来打印不同级别的日志,例如Debug、Info、Warn、Error等等。
5.输出日志
Logger 对象默认将日志输出到 os.Stderr,可以通过 Logger 对象的 Out 属性来指定输出到其他的 io.Writer,例如:
代码语言:javascript复制log.Out = os.Stdout
可以通过Logger对象的Hook属性来添加Hook,实现异步输出和处理日志的需求,例如:
代码语言:javascript复制log.Hooks.Add(hook)
这些就是logrus的基本使用方法,可以根据具体需求来使用logrus的其他高级功能。
3.logrus 实现日志滚动
在实际开发过程中,为了节省磁盘和方便查看,日志需要按照时间或者大小维度进行切割分成多分归档过期的日志,删除久远的日志.这个就是在日常开发中经常遇见的日志滚动(log rotation)。
那么在 logrus 中我们该如何实现这个功能呢? logrus 本身并没有实现滚动日志功能,但是我们可以使用第三方滚动插件实现。
我们可以使用 lumberjack 实现 logrus 的滚动日志,具体实现如下:
代码语言:javascript复制package main
import (
log "github.com/Sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logger := &lumberjack.Logger{
// 日志输出文件路径
Filename: "/var/log/myapp/foo.log",
// 日志文件最大 size, 单位是 MB
MaxSize: 100, // megabytes
// 最大过期日志保留的个数
MaxBackups: 10,
// 保留过期文件的最大时间间隔,单位是天
MaxAge: 30, //days
// 是否需要压缩滚动日志, 使用的 gzip 压缩
Compress: true, // disabled by default
}
log.SetOutput(logger) //调用 logrus 的 SetOutput()函数
}
滚动日志的各项参数如注释所示, logrus的setOutput()函数的入参是io.Writer类型, lumberjack.Logger实现了该接口。
4.一个完整的示例
这里使用 logrus 缺省的 Logger 对象,对其进行各项配置。
代码语言:javascript复制import (
"fmt"
"github.com/sirupsen/logrus"
lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
// Level 日志级别。建议从服务配置读取。
var LogConf = struct {
Dir string `yaml:"dir"`
Name string `yaml:"name"`
Level string `yaml:"level"`
MaxSize int `yaml:"max_size"`
}{
Dir: "./logs",
Name: "yourlogname.log",
Level: "trace",
MaxSize: 100,
}
// Init logrus logger.
func InitLogger() error {
// 设置日志格式。
logrus.SetFormatter(&logrus.TextFormatter{
TimestampFormat: "2006-01-02 15:04:05.000",
})
switch Level {
case "trace":
logrus.SetLevel(logrus.TraceLevel)
case "debug":
logrus.SetLevel(logrus.DebugLevel)
case "info":
logrus.SetLevel(logrus.InfoLevel)
case "warn":
logrus.SetLevel(logrus.WarnLevel)
case "error":
logrus.SetLevel(logrus.ErrorLevel)
case "fatal":
logrus.SetLevel(logrus.FatalLevel)
case "panic":
logrus.SetLevel(logrus.PanicLevel)
}
logrus.SetReportCaller(true) // 打印文件、行号和主调函数。
// 实现日志滚动。
// Refer to https://www.cnblogs.com/jssyjam/p/11845475.html.
logger := &lumberjack.Logger{
Filename: fmt.Sprintf("%v/%v", LogConf.Dir, LogConf.Name), // 日志输出文件路径。
MaxSize: LogConf.MaxSize, // 日志文件最大 size(MB),缺省 100MB。
MaxBackups: 10, // 最大过期日志保留的个数。
MaxAge: 30, // 保留过期文件的最大时间间隔,单位是天。
LocalTime: true, // 是否使用本地时间来命名备份的日志。
}
logrus.SetOutput(logger)
return nil
}
5.小结
logrus 还有很多高级的用法,如有需要,可以深入研究。
此外,除了 logrus,Golang 还有很多好用的日志库,以下是几个比较流行的:
log包 Go语言自带了一个log包,可以满足基本的日志需求。这个包有几个函数:Print、Printf、Println、Fatal、Fatalf、Fatalln、Panic、Panicf、Panicln,可以满足大部分日志的打印和处理需求。
zap zap是Uber开源的一款高性能日志库,它支持多种日志级别和输出方式,包括console、json、file等等。zap的性能比较优秀,它使用了Zero Allocation的设计理念,在不影响性能的情况下尽量避免内存分配。
zerolog zerolog是一款轻量级的日志库,具有非常好的性能和可扩展性。它支持多种日志级别、输出格式和输出方式,包括console、json、file等等。zerolog的设计理念是简单、易用、高性能,代码量也比较少。
总的来说,以上几个日志库都具有不同的优点和适用场景,可以根据具体需求选择使用。