log
包定义了Logger
类型,该类型提供了一些格式化输出的方法。
log
包中预定义了一个标准logger
对象std
,使我们可以直接调用函数来打印日志,默认是标准错误输出(Stderr
),打印到终端界面。当然也可以自定义创建logger
对象,控制std
所调用的所有函数在内部都是调用了同名的logger
类型的方法。
函数包括:
Print()
、Printf()
、Println()
Fatal()
、Fatalf()
、Fatalln()
:触发fatal
,写入日志信息后调用os.Exit(1)
,程序直接退出,不会调用deferPanic
、Panicf
、Panicln
:触发panic
示例:
log.Print("Print\n")
v := "Printf"
log.Printf("%s\n", v)
log.Println("Println")
log.Fatalln("触发fatal")
log.Panicln("触发panic")
输出:
2020/08/09 13:41:18 Print
2020/08/09 13:41:18 Printf
2020/08/09 13:41:18 Println
2020/08/09 13:41:18 触发fatal
log
包中预定义的logger
对象默认会打印每条日志信息的日期、时间。例子中调用Fatalln()
函数后,打印了日志信息,然后程序直接退出。
当我们不满足于默认的日期和时间,就需要配置logger
获得更多信息。
log
包中可以用SetFlags()
函数来设置std
的输出配置,然后可以用Flags()
函数来返回std
的输出配置。如果是自定义logger
对象,也有同名方法可以使用,调用函数本质上是在内部用std
调用同名方法。
func Flags() int
func SetFlags(flag int)
log
包为参数flag
定义了一系列常量:
const (
Ldate = 1 << iota // the date in the local time zone: 2009/01/23
Ltime // the time in the local time zone: 01:23:23
Lmicroseconds // microsecond resolution: 01:23:23.123123. assumes Ltime.
Llongfile // 文件全路径名 and line number: /a/b/c/d.go:23
Lshortfile // 文件名 and line number: d.go:23. 会覆盖Llongfile
LUTC // if Ldate or Ltime is set, use UTC rather than the local time zone
Lmsgprefix // move the "prefix" from the beginning of the line to before the message
LstdFlags = Ldate | Ltime // initial values for the standard logger
)
LstdFlags
是标准logger
对象std
配置的初始值,下面是std
的声明语句:
var std = New(os.Stderr, "", LstdFlags)
示例:
log.SetFlags(log.Lshortfile | log.Lmicroseconds | log.Ldate)
log.Println("配置之后的日志")
输出:
2020/08/09 14:24:52.532449 main.go:17: 配置之后的日志
此时查看其输出配置:
fmt.Println(log.Flags()) // 13
输出13是因为,Llongfile
的值是8
,Lmicroseconds
的值是4
,Ldate
的值1
,或运算后得到13
。
给输出的日志添加指定的前缀,有助于之后的信息检索。
log
包中可以用SetPrefix()
函数来设置std
的输出前缀,还可以用Prefix()
函数查看std
的输出前缀。如果是自定义logger
对象,也有同名方法可以使用,调用函数本质上是在内部用std
调用同名方法。
示例(logger
配置接上例):
log.SetPrefix("[我是前缀]")
log.Println("带前缀的日志。")
fmt.Println(log.Prefix())
输出:
[我是前缀]2020/08/09 14:44:05.437154 main.go:20: 带前缀的日志。
[我是前缀]
log
包中可以用SetOutput()
函数来设置std
的输出目的地,默认是标准错误输出(Stderr
)。如果是自定义logger
对象,也有同名方法可以使用,调用函数本质上是在内部用std
调用同名方法。
示例:
logFile, err := os.OpenFile("t1.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
fmt.Println("open log file failed, err:", err)
return
}
log.SetOutput(logFile)
log.SetFlags(log.Lshortfile | log.Lmicroseconds | log.Ldate)
log.SetPrefix("[我是前缀]")
log.Println("我是日志。")
上例会将日志输出到同目录下的t1.log
文件中。
文件中的输出:
[我是前缀]2020/08/09 15:12:25.340135 main.go:31: 我是日志。
如果使用std
,可以将配置操作写到init()
函数中。
log
包提供了logger
对象的构造函数New()
,格式如下:
func New(out io.Writer, prefix string, flag int) *Logger
参数依次是输出目的地、前缀、日志信息。
示例:
logger := log.New(os.Stderr, "" , log.Lshortfile|log.Ldate|log.Ltime)
logger.Println("自定义logger日志。")
输出:
<New>2020/08/09 15:25:17 main.go:33: 自定义logger日志。
参考
第三方日志库logrus
第三方日志库zap