6

聊聊klog的header

 3 years ago
source link: https://studygolang.com/articles/32389
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

聊聊klog的header

codecraft · 大约10小时之前 · 32 次点击 · 预计阅读时间 3 分钟 · 不到1分钟之前 开始浏览    

本文主要研究一下klog的header

println

k8s.io/klog/[email protected]/klog.go

func (l *loggingT) println(s severity, logr logr.Logger, filter LogFilter, args ...interface{}) {
    buf, file, line := l.header(s, 0)
    // if logr is set, we clear the generated header as we rely on the backing
    // logr implementation to print headers
    if logr != nil {
        l.putBuffer(buf)
        buf = l.getBuffer()
    }
    if filter != nil {
        args = filter.Filter(args)
    }
    fmt.Fprintln(buf, args...)
    l.output(s, logr, buf, file, line, false)
}

println方法先执行l.header(s, 0),若logr不为nil则先l.putBuffer(buf),然后重新设置buf

header

k8s.io/klog/[email protected]/klog.go

func (l *loggingT) header(s severity, depth int) (*buffer, string, int) {
    _, file, line, ok := runtime.Caller(3 + depth)
    if !ok {
        file = "???"
        line = 1
    } else {
        if slash := strings.LastIndex(file, "/"); slash >= 0 {
            path := file
            file = path[slash+1:]
            if l.addDirHeader {
                if dirsep := strings.LastIndex(path[:slash], "/"); dirsep >= 0 {
                    file = path[dirsep+1:]
                }
            }
        }
    }
    return l.formatHeader(s, file, line), file, line
}

header方法最后执行l.formatHeader

formatHeader

k8s.io/klog/[email protected]/klog.go

// formatHeader formats a log header using the provided file name and line number.
func (l *loggingT) formatHeader(s severity, file string, line int) *buffer {
    now := timeNow()
    if line < 0 {
        line = 0 // not a real line number, but acceptable to someDigits
    }
    if s > fatalLog {
        s = infoLog // for safety.
    }
    buf := l.getBuffer()
    if l.skipHeaders {
        return buf
    }

    // Avoid Fprintf, for speed. The format is so simple that we can do it quickly by hand.
    // It's worth about 3X. Fprintf is hard.
    _, month, day := now.Date()
    hour, minute, second := now.Clock()
    // Lmmdd hh:mm:ss.uuuuuu threadid file:line]
    buf.tmp[0] = severityChar[s]
    buf.twoDigits(1, int(month))
    buf.twoDigits(3, day)
    buf.tmp[5] = ' '
    buf.twoDigits(6, hour)
    buf.tmp[8] = ':'
    buf.twoDigits(9, minute)
    buf.tmp[11] = ':'
    buf.twoDigits(12, second)
    buf.tmp[14] = '.'
    buf.nDigits(6, 15, now.Nanosecond()/1000, '0')
    buf.tmp[21] = ' '
    buf.nDigits(7, 22, pid, ' ') // TODO: should be TID
    buf.tmp[29] = ' '
    buf.Write(buf.tmp[:30])
    buf.WriteString(file)
    buf.tmp[0] = ':'
    n := buf.someDigits(1, line)
    buf.tmp[n+1] = ']'
    buf.tmp[n+2] = ' '
    buf.Write(buf.tmp[:n+3])
    return buf
}

如果设置了l.skipHeaders,则不会进行format

func headerDemo() {
    flag.Set("skip_headers", "true")
    klog.Info("hello by Info")
    klog.InfoDepth(0, "hello by InfoDepth 0")
    klog.InfoDepth(1, "hello by InfoDepth 1")
    klog.Infoln("hello by Infoln")
    klog.Infof("hello by %s", "Infof")
    klog.InfoS("Pod status updated", "pod", "kubedns", "status", "ready")
}
hello by Info
hello by InfoDepth 0
hello by InfoDepth 1
hello by Infoln
hello by Infof
"Pod status updated" pod="kubedns" status="ready"

默认带header输出如下

I1229 23:45:57.827487    2176 klog_demo.go:41] hello by Info
I1229 23:45:57.827591    2176 klog_demo.go:42] hello by InfoDepth 0
I1229 23:45:57.827600    2176 klog_demo.go:31] hello by InfoDepth 1
I1229 23:45:57.827605    2176 klog_demo.go:44] hello by Infoln
I1229 23:45:57.827608    2176 klog_demo.go:45] hello by Infof
I1229 23:45:57.827617    2176 klog_demo.go:46] "Pod status updated" pod="kubedns" status="ready"

如果设置klog的skip_headers为true,则其l.skipHeaders为true,则不会格式化并输出header信息。


有疑问加站长微信联系(非本文作者)

280

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK