今天来说下使用gobox中的log操作

log级别定义

const (
	LEVEL_EMERGENCY = 0
	LEVEL_ALERT     = 1
	LEVEL_CRITICAL  = 2
	LEVEL_ERROR     = 3
	LEVEL_WARNING   = 4
	LEVEL_NOTICE    = 5
	LEVEL_INFO      = 6
	LEVEL_DEBUG     = 7
)

var LogLevels map[int][]byte = map[int][]byte{
	LEVEL_EMERGENCY: []byte("emergency"),
	LEVEL_ALERT:     []byte("alert"),
	LEVEL_CRITICAL:  []byte("critical"),
	LEVEL_ERROR:     []byte("error"),
	LEVEL_WARNING:   []byte("warning"),
	LEVEL_NOTICE:    []byte("notice"),
	LEVEL_INFO:      []byte("info"),
	LEVEL_DEBUG:     []byte("debug"),
}

重要的interface

IWriter

定义消息写入到哪里,如磁盘、队列等

type IWriter interface {
	io.Writer

	Flush() error
	Free()
}

包中实现了如下对象:

记录到单个文件

type FileWriter struct

记录到文件,按天或小时切割

const (
	SPLIT_BY_DAY  = 1
	SPLIT_BY_HOUR = 2
)

type FileWithSplitWriter struct

输出到console,这个写工具调试时用处最多

type ConsoleWriter struct

buffer,这个是对writer的一层装饰,有有效提升写入性能

buffer使用示例:

package main

import (
	"github.com/goinbox/golog"

	"time"
)

func main() {
	golog.InitBufferAutoFlushRoutine(1024, time.Second*3)     // buffer会启动一个单独的goroutine去做buffer的定时flush

	path := "/tmp/test_buffer.log"
	bufsize := 1024

	fw, _ := golog.NewFileWriter(path)
	bw := golog.NewBuffer(fw, bufsize)

	bw.Write([]byte("test file writer with buffer and time interval\n"))

	time.Sleep(time.Second * 5)
	bw.Free()

	golog.FreeBuffers()
}

IFormater

formater可以对要记录的消息做一次格式化加工

type IFormater interface {
	Format(level int, msg []byte) []byte
} 

包里预置了几个常用的formater实现:

simpleFormater

简单程序使用

func NewSimpleFormater() *simpleFormater

webFormater

web程序使用

func NewWebFormater(logId, ip []byte) *webFormater

consoleFormater

console输出使用

func NewConsoleFormater() *consoleFormater

ILogger

这个定义程序中负责记录log的对象

type ILogger interface {
	Debug(msg []byte)
	Info(msg []byte)
	Notice(msg []byte)
	Warning(msg []byte)
	Error(msg []byte)
	Critical(msg []byte)
	Alert(msg []byte)
	Emergency(msg []byte)

	Log(level int, msg []byte) error

	Flush() error
	Free()
}

本包中提供了两个对象实现:

简单同步logger

同步操作,写log时阻塞程序执行

func NewSimpleLogger(writer IWriter, globalLevel int, formater IFormater) (*simpleLogger, error)

使用示例:

package main

import (
	"github.com/goinbox/golog"

	"time"
)

func main() {
	golog.InitBufferAutoFlushRoutine(1024, time.Second*7)

	fw, _ := golog.NewFileWriter("/tmp/test_simple_buffer_logger.log")
	bw := golog.NewBuffer(fw, 1024)
	logger, _ := golog.NewSimpleLogger(bw, golog.LEVEL_INFO, golog.NewSimpleFormater())

	msg := []byte("test simple buffer logger")

	logger.Debug(msg)
	logger.Info(msg)
	logger.Notice(msg)
	logger.Warning(msg)
	logger.Error(msg)
	logger.Critical(msg)
	logger.Alert(msg)
	logger.Emergency(msg)

	logger.Free()
}

异步logger

异步logger将导致阻塞的写操作放到一个单独的goroutine中执行,能有效提升系统性能。

笔者在一个web项目中压测了使用同步log和异步log的性能对比:

同步:

sync

异步:

async

使用示例:

package main

import (
	"github.com/goinbox/golog"

	"time"
)

func main() {
	golog.InitBufferAutoFlushRoutine(1024, time.Second*7)
	golog.InitAsyncLogRoutine(4096)

	defer func() {
		golog.FreeBuffers()
		golog.FreeAsyncLogRoutine()
	}()

	fw, _ := golog.NewFileWriter("/tmp/test_async_web_logger.log")
	bw := golog.NewBuffer(fw, 1024)
	sl, _ := golog.NewSimpleLogger(bw, golog.LEVEL_INFO, golog.NewWebFormater([]byte("async_web"), []byte("127.0.0.1")))
	logger := golog.NewAsyncLogger(sl)

	msg := []byte("test async web logger")

	logger.Debug(msg)
	logger.Info(msg)
	logger.Notice(msg)
	logger.Warning(msg)
	logger.Error(msg)
	logger.Critical(msg)
	logger.Alert(msg)
	logger.Emergency(msg)

	logger.Free()
}

欢迎大家使用,使用中有遇到问题随时反馈,我们会尽快响应,谢谢!