任何一个系统开发,都离不开完备的日志系统。go 日志不同其他语言,比如 java 由于 commons-logging 日志标准,和不同实现 如log4j,slf4j,logback,但都是统一调用标准接口;python 中标准logging 模块,功能强大,基本上满足各种需求。但是在golang 语言开发中,目前阅读了几个开源代码,都是自己实现了一套日志记录标准,并没有采用go 官方 log 模块。golang's log 模块主要提供了3类接口。分别是 “Print 、Panic 、Fatal ”,对每一类接口其提供了3中调用方式,分别是 "Xxxx 、 Xxxxln 、Xxxxf",基本和fmt中的相关函数类似;但功能有限,很难比如按天,按照容量自动输出拆封生成新日志。如果自己开发一套日子,基本上要满足日志等级输出如DEBUG,INFO,WARN,ERROR/FATAL 、支持输出 console 和滚动式文件、参数格式化输出、自定义格式化模板,当然如果支持更高级别如按照pakcage输出到不同文件,按照日志级别输出到不同地方那就更帅气了。
下面罗列觉得可能后期会用开源项目
project | stars | forks | description |
---|---|---|---|
8995 | 1071 | Logrus is a structured logger for Go (golang), completely API compatible with the standard library logger. | |
5292 | 376 | blazing fast, structured, leveled logging in Go. | |
1414 | 85 | The zerolog package provides a fast and simple logger dedicated to JSON output. | |
220 | 32 | BLog4go is an efficient logging library written in the Go programming language, providing logging hook, log rotate, filtering and formatting log message. | |
logrus是已知的Go语言日志库中在github中stars数最多的日志库,功能强大,性能也不错。另外值得一提的是logrus的一个fork库gogap/logrus,可以配置输出到文件和graylog日志系统,基础的level、调用链、行号,文件切分都有,特色是结构化日志可以被统计和索引,借助graylog就可以做日志分析,不过这个库很久没有维护了。
zap是Go中一个快速,结构化,分级日志库,Uber出品。能够激活强大的ad-hoc分析, 灵活的仪表板, 其功能超过其他工具ELK, Splunk, 和 Sentry. 所有日志消息都是JSON-serialized。具体参考 Go高性能日志库zap详细分析 。
zerolog也是一款性能相当好的日志库,有趣的是zerolog和zap都在自家的Github库首页中的性能对比数据里打败了对方,zerolog 是受到uber 的日志库zap 的启发,golang社区里,对高性能日志库的追求,引发了编译器团队对一些使用模式的优化。
blog4go是高性能日志库。创新地使用“边解析边输出”方法进行日志输出,同时支持回调函数、日志淘汰和配置文件。可以解决高并发,调用日志函数频繁的情境下,日志库造成的性能问题。
最后 提供两个 benchmark库,提供的部分Go日志库的性能对比数据,供技术选型时参考
https://github.com/hnakamur/go-log-benchmarks
https://github.com/imkira/go-loggers-bench