欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-03 19:07:49
普通使用log包定义了Logger类型,该类型提供了一些格式化输出的方法。log包中预定义了一个标准logger对象std,使我们可以直接调用函数来打印日志,默认是标准错误输出(Stderr),打印到终端界面。当然也可以自定义创建logger对象,控制std所调用的所有函数在内部都是调用了同名的logger类型的方法。函数包括:Print()、Printf()、Println()Fatal()、Fatalf()、Fatalln():触发fatal,写入日志信息后调用os.Exit(1),程序直接...

普通使用

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, "<New>", log.Lshortfile|log.Ldate|log.Ltime)
logger.Println("自定义logger日志。")

输出:

<New>2020/08/09 15:25:17 main.go:33: 自定义logger日志。

参考
第三方日志库logrus
第三方日志库zap

本文地址:https://blog.csdn.net/m0_37710023/article/details/107893065