一、前言
在 Go 社区中有很多优秀的开源日志框架(如: zap, logrus 等), 它们不仅功能丰富, 而且性能很好, 能够满足绝大数应用场景! 但是在日常开发过程中,因为自身需求或者项目体量的原因, 你也许会觉得这么高大上的日志库对自己来说有点功能过剩, 因为它们的优秀导致学习成本增加, 想要快速入门似乎需要花一些心思才行(学习成本上升并不是将其拒之门外的理由,相反,社区能够有这些优秀的成熟项目是值得每位Gopher为之高兴的事, 要想技术得到提升, 阅读并学习这些优秀的开源项目是必须的), 此时一个简单实用, 容易上手的日志库便成为了自己最想要的。 其实对于大多数人需要使用的日志场景无非以下几点:
- 能够分级别输出日志
- 能够根据时间或者文件大小对日志文件进行切割保存
- 能够根据配置选择需要输出的日志级别
为了探讨学习之用, 在下实践了一款简单实用的异步日志库: plogs
代码采用Golang Channel实现异步写, 如果需要, 可以通过配置同步输出到stdout
二、功能
- 格式化日志输出
- 异步输出日志到文件(终端采用同步输出)
- 可通过
WithWriter()
添加自定义Writer -
temp.log
总是当前正在输出的日志文件 - 日志输出级别可配置(默认输出所有级别的日志)
- 日志文件切割方式: 达到指定大小后执行切割, 默认不切割
- 提供日志文件保存时长设置: 超过该时长的文件将被删除, 默认不作删除操作
- 日志级别划分: Panic(异常, 可以捕获), Fatal(致命错误), Error(错误), Warn(警告), Info(流水), Debug(调试信息)
- 提供不同的日志记录方式:
WriteByLevelSeparated(根据Level记录在不同的子目录下)
,WriteByLevelMerged(所有Level的日志记录在一起)
,WriteByBoth(单独记录与归并记录同时存在)
三、使用
package main
import (
"fmt"
"time"
"github.com/pyihe/go-pkg/tools"
"github.com/pyihe/plogs"
)
func main() {
opts := []plogs.Option{
plogs.WithName("ALTIMA"),
plogs.WithFileOption(plogs.WriteByLevelMerged),
plogs.WithLogPath("./logs"),
plogs.WithLogLevel(plogs.LevelFatal | plogs.LevelError | plogs.LevelWarn | plogs.LevelInfo | plogs.LevelDebug),
plogs.WithStdout(true),
plogs.WithMaxAge(24 * time.Hour),
plogs.WithMaxSize(10 * 1024 * 1024),
}
logger := plogs.NewLogger(opts...)
defer logger.Close()
go func() {
tag := time.Now()
for n := 0; n < 3; n++ {
for i := 1; i < 500000; i++ {
plogs.Debugf("hello, this is level panic!")
plogs.Infof("hello, this is level panic!")
plogs.Warnf("hello, this is level panic!")
plogs.Errorf("hello, this is level panic!")
}
}
fmt.Printf("time consume: %v\n", time.Now().Sub(tag).Milliseconds())
}()
tools.Wait()
}
效果截图: