golang log4go 使用说明及丢失日志原因
1. 描述
這個(gè) repository 是從 alecthomas 的 log4go 重構(gòu)而來(lái)的,log4go 是一個(gè)類似于用于 Java 編程語(yǔ)言的 log4j 的日志包。源于 Google 的一項(xiàng) log 工程,官方已經(jīng)停止維護(hù)更新。
倉(cāng)庫(kù)地址:
https://github.com/jeanphorn/log4go.git
2. 特點(diǎn)
- 日志輸出到終端
- 日志輸出到文件,支持按大小和時(shí)間切片
- 日志輸出到網(wǎng)絡(luò)
- 日志異步輸出
- 支持
json文件配置 - 日志分類
- 不同類別的日志,輸出到不同的printer中.
- 兼容老的日志方式
3. 使用示例
- 下載源碼
go get github.com/jeanphorn/log4go
- 導(dǎo)入進(jìn)工程
import log "github.com/jeanphorn/log4go"
- 具體步驟,請(qǐng)查看
https://github.com/jeanphorn/log4go
4. 不用配置文件使用
也可以不適用配置文件,直接在代碼中設(shè)置好 log 的格式、回滾級(jí)別、備份日志個(gè)數(shù)等,代碼示例如下:
package mainimport (l4g "github.com/jeanphorn/log4go"
)var (Log l4g.Logger = make(l4g.Logger)
)func InitLog(filename string) {_, err := os.Stat("./log/")if os.IsNotExist(err) {os.Mkdir("./log/", 0755)}flw := l4g.NewFileLogWriter("./log/"+filename, false, false)flw.SetFormat("[%D %T] [%L] (%S) %M")flw.SetRotate(true)flw.SetRotateSize(1 * 1024 * 1024) // 10Mflw.SetRotateMaxBackup(10) // 備份的日志文件數(shù)量flw.SetRotateDaily(false) // 不按天回滾flw.SetSanitize(true)Log.AddFilter("file", l4g.INFO, flw)Log.Info("Log init done")time.Sleep(100 * time.Microsecond)
}func main() {InitLog("test.log")Log.Info("this is info")
}
但是運(yùn)行之后,log 文件中沒(méi)有日志打印,原因是:
log4go 用的是 channel 暫存日志,打印會(huì)另起一個(gè) goroutine 進(jìn)行,但是主 goroutine 退出太快時(shí),負(fù)責(zé)打印日志的 goroutine 沒(méi)機(jī)會(huì)把 channel 中的日志打印出來(lái),導(dǎo)致日志丟失。
5. 解決方法
在程序最后加上: time.Sleep(time.Microsecond) , sleep() 調(diào)用會(huì)留給打印日志的 goroutine 執(zhí)行的時(shí)間。
func main() {InitLog("test.log")Log.Error("this is error")time.Sleep(100 * time.Microsecond)Log.Info("this is info")time.Sleep(100 * time.Microsecond)
}
6. 其它 log 庫(kù)
- https://github.com/hhkbp2/go-logging.git
- https://github.com/cihub/seelog
參考:
- https://stackoverrun.com/cn/q/3852638
- https://www.v2ex.com/amp/t/239039
總結(jié)
以上是生活随笔為你收集整理的golang log4go 使用说明及丢失日志原因的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《题山石榴花》是谁的作品?
- 下一篇: Go 学习笔记(31)— 字符串 str