golang包的日常(2)——log包

普通使用

log包定义了Logger类型,该类型提供了一些格式化输出的方法。
log包中预定义了一个标准logger对象std,使我们可以直接调用函数来打印日志,默认是标准错误输出(Stderr),打印到终端界面。当然也可以自定义创建logger对象,控制std所调用的所有函数在内部都是调用了同名的logger类型的方法。
函数包括:

  • Print()Printf()Println()
  • Fatal()Fatalf()Fatalln():触发fatal,写入日志信息后调用os.Exit(1),程序直接退出,不会调用defer
  • PanicPanicfPanicln:触发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

当我们不满足于默认的日期和时间,就需要配置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的值是8Lmicroseconds的值是4Ldate的值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()函数中。

自定义logger对象

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

你可能感兴趣的:(golang包的日常,go,golang)