乘风原创程序

  • golang包的日常(2)——log包
  • 2020/8/12 13:47:43
  • 普通使用

    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