本文主要研究一下klog的header
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
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
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 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信息。