33
gobox中的log操作
source link: http://blog.7rule.com/2018/08/11/gobox-log.html?amp%3Butm_medium=referral
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.
今天来说下使用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的性能对比:
同步:
异步:
使用示例:
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() }
欢迎大家使用,使用中有遇到问题随时反馈,我们会尽快响应,谢谢!
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK