内容简介:主要实现了线程安全的print, printf功能,即格式化要打印日志。 w 这个writer做为初始参数,可以从外面传输,解构writer,方便自己配置writer,比如std.Out/std.Err 等实现了Writer接口的struct即可。Backend还实现了一个创建实例的工厂函数:这个类实现了interface: Logger所有接口。 而内部实现事业 Backend. 通过Level来控制日志显示级别。 tag来标识日志来自某个子系统 subsystem.
btcd-go 中log部分代码
整体设计
interface : Logger struct: slog struct: Backend
Backend
type Backend struct {
w io.Writer
mu sync.Mutex // ensures atomic writes
flag uint32
}
主要实现了线程安全的print, printf功能,即格式化要打印日志。 w 这个writer做为初始参数,可以从外面传输,解构writer,方便自己配置writer,比如std.Out/std.Err 等实现了Writer接口的struct即可。
Backend还实现了一个创建实例的工厂函数:
func (b* Backend) Logger(subsystemTag string) Logger {
return &slog{LevelInfo, subsystemTag, b}
}
slog
type slog struct {
lvl Level
tag string
b *Backend
}
这个类实现了interface: Logger所有接口。 而内部实现事业 Backend. 通过Level来控制日志显示级别。 tag来标识日志来自某个子系统 subsystem.
以字符形式,按固定长度输出数字,长度不够,前面用0补齐。
但是这个算法,只要i大于0才能正常工作,所以,把i类型改成uint更合适
// From stdlib log package.
// Cheap integer to fixed-width decimal ASCII. Give a negative width to avoid
// zero-padding.
func itoa(buf *[]byte, i int, wid int) {
// Assemble decimal in reverse order.
var b [20]byte
bp := len(b) - 1
for i >= 10 || wid > 1 {
wid--
q := i / 10
b[bp] = byte('0' + i - q*10)
bp--
i = q
}
// i < 10
b[bp] = byte('0' + i)
*buf = append(*buf, b[bp:]...)
}
给slice赋值为0的用法
// recycleBuffer puts the provided byte slice, which should have been obtain via
// the buffer function, back on the free list.
func recycleBuffer(b *[]byte) {
*b = (*b)[:0]
bufferPool.Put(b)
}
其中的 *b = (*b)[:0] 就是把b 这个byte slice赋值为0
多go routine下,使用pool来
var bufferPool = sync.Pool{
New: func() interface{} {
b := make([]byte, 0, 120)
return &b
},
}
如果有多个go routine 输出日志,可使用pool来避免,竞争同一个缓存,如使用同一个缓存,会导致其他go routine挂起,而只在writer写数据时,才使用Mutex来同步,这样效率更高,用空间换时间。
参考
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 解读阿里巴巴 Java 代码规范,第 2 部分: 从代码处理等方面解读阿里巴巴 Java 代码规范
- 解读Java静态代码块和构造代码块
- 动画+原理+代码,解读十大经典排序算法
- Ectouch2.0 分析解读代码审计流程
- 十余行代码完成迁移学习,百度PaddleHub实战解读
- 谷歌终于开源BERT代码:3 亿参数量,机器之心全面解读
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
挑战程序设计竞赛
秋叶拓哉、岩田阳一、北川宜稔 / 巫泽俊、庄俊元、李津羽 / 人民邮电出版社 / 2013-7-1 / CNY 79.00
世界顶级程序设计高手的经验总结 【ACM-ICPC全球总冠军】巫泽俊主译 日本ACM-ICPC参赛者人手一册 本书对程序设计竞赛中的基础算法和经典问题进行了汇总,分为准备篇、初级篇、中级篇与高级篇4章。作者结合自己丰富的参赛经验,对严格筛选的110 多道各类试题进行了由浅入深、由易及难的细致讲解,并介绍了许多实用技巧。每章后附有习题,供读者练习,巩固所学。 本书适合程序设计......一起来看看 《挑战程序设计竞赛》 这本书的介绍吧!
SHA 加密
SHA 加密工具
RGB CMYK 转换工具
RGB CMYK 互转工具