一躏哩、前言
在 Go 社區(qū)中有很多優(yōu)秀的開源日志框架(如: zap, logrus 等), 它們不僅功能豐富, 而且性能很好, 能夠滿足絕大數(shù)應(yīng)用場(chǎng)景! 但是在日常開發(fā)過(guò)程中,因?yàn)樽陨硇枨蠡蛘唔?xiàng)目體量的原因, 你也許會(huì)覺得這么高大上的日志庫(kù)對(duì)自己來(lái)說(shuō)有點(diǎn)功能過(guò)剩, 因?yàn)樗鼈兊膬?yōu)秀導(dǎo)致學(xué)習(xí)成本增加, 想要快速入門似乎需要花一些心思才行(學(xué)習(xí)成本上升并不是將其拒之門外的理由肋层,相反,社區(qū)能夠有這些優(yōu)秀的成熟項(xiàng)目是值得每位Gopher為之高興的事, 要想技術(shù)得到提升, 閱讀并學(xué)習(xí)這些優(yōu)秀的開源項(xiàng)目是必須的), 此時(shí)一個(gè)簡(jiǎn)單實(shí)用, 容易上手的日志庫(kù)便成為了自己最想要的。 其實(shí)對(duì)于大多數(shù)人需要使用的日志場(chǎng)景無(wú)非以下幾點(diǎn):
- 能夠分級(jí)別輸出日志
- 能夠根據(jù)時(shí)間或者文件大小對(duì)日志文件進(jìn)行切割保存
- 能夠根據(jù)配置選擇需要輸出的日志級(jí)別
為了探討學(xué)習(xí)之用, 在下實(shí)踐了一款簡(jiǎn)單實(shí)用的異步日志庫(kù): plogs
代碼采用Golang Channel實(shí)現(xiàn)異步寫, 如果需要, 可以通過(guò)配置同步輸出到stdout
二、功能
- 格式化日志輸出
- 異步輸出日志到文件(終端采用同步輸出)
- 可通過(guò)
WithWriter()
添加自定義Writer -
temp.log
總是當(dāng)前正在輸出的日志文件 - 日志輸出級(jí)別可配置(默認(rèn)輸出所有級(jí)別的日志)
- 日志文件切割方式: 達(dá)到指定大小后執(zhí)行切割, 默認(rèn)不切割
- 提供日志文件保存時(shí)長(zhǎng)設(shè)置: 超過(guò)該時(shí)長(zhǎng)的文件將被刪除, 默認(rèn)不作刪除操作
- 日志級(jí)別劃分: Panic(異常, 可以捕獲), Fatal(致命錯(cuò)誤), Error(錯(cuò)誤), Warn(警告), Info(流水), Debug(調(diào)試信息)
- 提供不同的日志記錄方式:
WriteByLevelSeparated(根據(jù)Level記錄在不同的子目錄下)
,WriteByLevelMerged(所有Level的日志記錄在一起)
,WriteByBoth(單獨(dú)記錄與歸并記錄同時(shí)存在)
三况木、使用
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()
}
效果截圖: