-
自定义输出协议的Sink
- 打印的日志先放入channel缓存
- 后台起一个协程读取channel写入文件
- 循环读channel缓存的日志、通过bufio合并写入文件,len(channel)为0则对bufio直接Flush。
- 使用lumberjack滚动日志
-
TODO:后台写文件的协程,可使用runtime.SetFinalizer优化,更优雅地通过GC关闭。
需要执行InitLog函数初始化
zaplog.InitLog(zaplog.BufioSize(1024*8), zaplog.WithFields(map[string]interface{}{"app": "dddd"}))
MacBook Pro (13-inch, M1, 2020) 起1000个协程,总共写1000w条日志并Flush到文件,有无写缓存的对比:
- 有bufio:缓存日志异步合并写文件,降低io消耗。每条日志耗时为1.099µs/p
- 无bufio:缓存日志异步写,本质问题高频io没有解决,每条日志耗时为3.089µs/p