1. 描述
这个 repository 是从 alecthomas 的 log4go
重构而来的,log4go
是一个类似于用于 Java
编程语言的 log4j
的日志包。源于 Google 的一项 log 工程,官方已经停止维护更新。
仓库地址:
https://github.com/jeanphorn/log4go.git
2. 特点
- 日志输出到终端
- 日志输出到文件,支持按大小和时间切片
- 日志输出到网络
- 日志异步输出
- 支持
json
文件配置 - 日志分类
- 不同类别的日志,输出到不同的printer中.
- 兼容老的日志方式
3. 使用示例
- 下载源码
go get github.com/jeanphorn/log4go
- 导入进工程
import log "github.com/jeanphorn/log4go"
- 具体步骤,请查看
https://github.com/jeanphorn/log4go
4. 不用配置文件使用
也可以不适用配置文件,直接在代码中设置好 log
的格式、回滚级别、备份日志个数等,代码示例如下:
package main
import (
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) // 10M
flw.SetRotateMaxBackup(10) // 备份的日志文件数量
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")
}
但是运行之后,log 文件中没有日志打印,原因是:
log4go
用的是 channel
暂存日志,打印会另起一个 goroutine
进行,但是主 goroutine
退出太快时,负责打印日志的 goroutine
没机会把 channel
中的日志打印出来,导致日志丢失。
5. 解决方法
在程序最后加上: time.Sleep(time.Microsecond)
, sleep()
调用会留给打印日志的 goroutine
执行的时间。
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 库
- https://github.com/hhkbp2/go-logging.git
- https://github.com/cihub/seelog
参考: