二次封装glog的原因在于,现在有多个语言的不同服务在跑,为了日志管理方便,会统一下日志级别及日志显示格式。
Go这边的日志一直用的glog.我之前也介绍过,这是个很好用的日志包,但它有它的一套定义,要统一风格的话,
只能在其基础再封装一层,以满足通用的INFO/WARN/ERROR/FATAL/DEBUG定义之类。
这是我初次封装后的效果:
看起来好像还可以。
但再细看下,会发现,前面的日志对应的代码文件与行号是显示的封装后的文件logger.go的文件和行号. 这样在查问题
时其实很不方便,因为不能直观的定位到你真正想要看到的文件和行号.
后面我去查了下它的源码,它源码是从stack中去取的,将它源码中取文件和行号的方式移至二次封装的go文件中就能取到你想要的了。
再测试下:
package main
/*
定制化修改下glog,以便统一日志显示方式
Author: XCL
Date: 2016-4-16
go run main.go -alsologtostderr=true -v 5
*/
import (
"flag"
"glog"
"logger"
)
func main() {
flag.Parse()
defer glog.Flush()
logger.Debug("Debug日志")
logger.Info("Info日志")
logger.Warn("Warn日志")
logger.Error("Error日志")
logger.Fatal("Fatal日志")
}
效果:
这个明显要好很多了。
glog包具体的修改如下:
func (l *loggingT) header(s severity, depth int) (*buffer, string, int) {
/*
_, file, line, ok := runtime.Caller(3 + depth)
if !ok {
file = "???"
line = 1
} else {
slash := strings.LastIndex(file, "/")
if slash >= 0 {
file = file[slash+1:]
}
}
return l.formatHeader(s, file, line), file, line
*/
return l.formatHeader(s, "???", 1), "???", 1
}
// 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()
// 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
}
按上面的例子注释掉相关代码,再在logger.go中做下二次封装即可.
这是个小东西,但关键是,当你找不到满足业务需求的东西时,可否先别急着满世界找第三包或造成个新轮子来替换之类,
有时或许改造一下手上现有的东西就是个足够低成本的好方案.
Blog: http://blog.csdn.net/xcl168