uniqush/log
uniqush/log 是 uniqush 项目中的 log 包. uniqush 是一个 移动设备的统一的推送服务
一般来说实现一个 log 包并不复杂, 对官方提供的 log 包进行少许包装即可完成. 本文之所以认为她优秀.是因为 uniqush/log 提供了 MultiLogger. 这正式其他 go log 包所不具备的.
优异之处: MultiLogger
看下定义
<!-- lang: cpp -->
type multiLogger struct {
loggers []Logger
}
Logger
不言而喻就是一个 log 接口, 这不必费笔墨讲解. MultiLogger 是一个 Logger 切片. 一般的一个应用一个 log 这是很常规的用法. MultiLogger 有什么必要么? 还记得很多httpd服务都有访问日志和错误日志么?这是分开的两个文件.
是了 MultiLogger 可以把不同级别的日志分别输出到不同的 io.Writer
. 比如根据级别分文件保存. 还有更妙的用法.
io.Writer 的妙处
uniqush/log 使用的输出是 io.Writer
接口. 不是 *os.File 之类的具体 struct 实例. 这就可以产生很多变化.
假设你的应用要求, 如果超过某个日志级别需要立刻通知到维护人员, 比如发 email 或者短信. 那就可以先实现一个 io.Writer
接口, 然后和日志级别一起作为
<!-- lang: cpp -->
func NewLogger(writer io.Writer, prefix string, logLevel int) Logger
作为NewLogger的参数. 得到一个 logMail, 当然普通的写文件日志的 logFile 也可以有一个. 这几个可以生成一个
<!-- lang: cpp -->
log:=MultiLogger(logMail, logFile)
好了, 用变量 log 记录日志吧, 不同的日志级别,文件也写了,及时的 email 通知也有了.
注意并发安全
整个实现中压根就没有用到锁, 并发如何办. 并发可以在 NewLogger
的参数writer
中实现. 也就是说这个设计把并发控制抛给使用者了.粗看好像不严谨,其实呢,在 writer
中加个锁啥的,很简单.
ps: 感觉作者应该考虑并发安全问题, 毕竟 go 官方的 log 是并发安全的,