序
本文主要研究一下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信息。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。