本文次要钻研一下klog的header

println

k8s.io/klog/v2@v2.4.0/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/v2@v2.4.0/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/v2@v2.4.0/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 Infohello by InfoDepth 0hello by InfoDepth 1hello by Infolnhello by Infof"Pod status updated" pod="kubedns" status="ready"

默认带header输入如下

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

小结

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

doc

  • klog