美文网首页
btcd-go 中log部分代码解读

btcd-go 中log部分代码解读

作者: terryc007 | 来源:发表于2018-09-08 06:49 被阅读34次

    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来同步,这样效率更高,用空间换时间。

    参考

    相关文章

      网友评论

          本文标题:btcd-go 中log部分代码解读

          本文链接:https://www.haomeiwen.com/subject/ubckgftx.html