聊聊klog的header

谁说我不能喝 提交于 2020-12-30 02:00:05

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

doc

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!