btcd-go 中log部分代码解读

栏目: Go · 发布时间: 6年前

内容简介:主要实现了线程安全的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来同步,这样效率更高,用空间换时间。

参考


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

众声喧哗

众声喧哗

胡泳 / 广西师范大学出版社 / 2008-9 / 35.00元

本书触及了网络政治学中的一个重大话题——网络空间中的私域与公域。随着科技的进步,在信息时代的开端,公与私的含义和边界都出现了不容忽视的游移。《众声喧哗》主要探讨,经由新的共有媒体的作用,传统的公私两分如何在社会和政治的双重压力下产生消长和易位。在这里,公域与私域不能看做结构性的东西,而必须视之为一种流和一种过程。在网络时代,我们既要追求生机勃勃的公共生活,又要保证私人领域一定的自主性。共有媒体也许......一起来看看 《众声喧哗》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具