Go内置log库

less than 1 minute read

Go语言内置的log库提供的API很简洁:

  • Default方法返回内置的标准Logger:无prefix,日志写到 os.Stderr
  • New方法用于自定义Logger,该方法的函数签名是 func New(out io.Writer, prefix string, flag int) *Logger。可见只要是实现了io.Writer的,都可以作为日志写入的对象,如标准输出,标准错误,/dev/null 等。这也暗合Linux“一切即文件”的思想。
  • Logger结构体,包括内置的标准Logger,提供了一系列写日志和设置日志属性的API,包括Print[f|ln]Fatal[f|ln]Panic[f|ln]SetOutputSetFlagsSetPrefix 等。
  • Logger结构体中含有互斥锁 sync.Mutex,用于保证写日志是并发安全的。换句话说,可以在多个goroutine中同时使用Logger来写日志。查看源码可知,Output方法和SetXxx方法都有用到这个互斥锁。

想法:

  • 内置的log库并没有level(DEBUG/WARN/ERROR)的概念,这点和python的log库不一样
  • log库对日志格式的控制是通过flags完成的,可定制化不多
  • 使用互斥锁可能会造成大量写日志时效率不高,这或许是产生许多第三方日志库的原因之一

参考:

Tags: ,

Categories:

Updated:

Comments