glog的二次封装

      二次封装glog的原因在于,现在有多个语言的不同服务在跑,为了日志管理方便,会统一下日志级别及日志显示格式。

Go这边的日志一直用的glog.我之前也介绍过,这是个很好用的日志包,但它有它的一套定义,要统一风格的话,

只能在其基础再封装一层,以满足通用的INFO/WARN/ERROR/FATAL/DEBUG定义之类。

    这是我初次封装后的效果:

           glog

    看起来好像还可以。
       但再细看下,会发现,前面的日志对应的代码文件与行号是显示的封装后的文件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日志")
}
效果:

   glognew

这个明显要好很多了。  

    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





       

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值