聊聊klog的header
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.
聊聊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信息。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK