几个log lib对比

最近对golang native log包和部门内部封装的xlog包做了简单的性能测试,代码大体如下

package main

import (
	"fmt"
	"net/http"
	_ "net/http/pprof"
	"os"

        // 这里对native进行简单封装,提供level
	"xxx/hplog"
        // 部门内部log封装
	"xxx/xlog"

	qlog "github.com/qiniu/log"
)

var (
	//全局日志实例
	logger *xlog.XLog

	qiniulogger *qlog.Logger
)

func initXLog() {
	logger = xlog.NewXLog("service_cart")
	err := logger.Open("./xlogs", "test", "Debug")
	if err != nil {
		fmt.Println("initLog failed, err:%v", err)
		return
	}
}

func initHPLog() {
	hplog.InitLogger("./hplogs", true, hplog.LInfo)
}

func initQiniuLog() {
	f, err := os.OpenFile("./qiniu/info.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	qiniulogger = qlog.New(f, "INFO ", qlog.Ldate|qlog.Ltime|qlog.Lshortfile|qlog.Lmicroseconds)
	qiniulogger.Info("quniulogger inited")
}

type handler struct {
}

func (h *handler) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
	rw.Write([]byte("hello"))

	//	xlog.Debug("user_id:%d cart_id:%d flag:%d", 11111, 2222, 33333)
	//	hplog.Infof("user_id:%d cart_id:%d flag:%d", 11111, 2222, 33333)
	qiniulogger.Infof("user_id:%d cart_id:%d flag:%d", 11111, 2222, 33333)
}

func main() {
	initXLog()
	initHPLog()
	initQiniuLog()

	server := new(http.Server)
	http.Handle("/api", new(handler))
	server.Handler = http.DefaultServeMux
	server.Addr = ":10013"
	err := server.ListenAndServe()
	if err != nil {
		fmt.Println(err)
	}
}

发现xlog.Notice的性能明显优于hplog,反复看了一下Notice的代码,发现Notice这个级别的log,xlog并没有添加linenum等信息,也就是没有调用runtime.Caller(2)这个代码非常耗性能。然后用xlog.Fatal其他level的试验了下,性能比hplog稍差,这是可以理解的程序结构方式稍有不同带来的损耗。

后续还调研了下七牛直接在native log上改的logext.go。性能比hplog差比较多,推测是native log中Output方法对于锁的使用造成一定性能损耗。hplog把这部分单独提了出来。但我自己单独对Outputlock的使用做了benchmark,并没有明显的性能损耗,大约差个10ns/op。技术上的瓶颈到时我没办法再进一步。

上面的log lib,不管用哪个都是6w+的级别,所以一般会成为主业务的瓶颈。这个也可能是很多web framework性能参差不齐。但是都有人用,而且做出来的app一般会依赖于db,所以可能忽略掉这种需要极致优化的地方(一般可能严重影响可用性)

几个log lib对比
Share this