goland 语言标准库log 介绍 | 青训营笔记

159 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作的第1篇笔记

log

无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯。

使用Logger

Logger 一般是用来记录程序在运行阶段或者调试阶段所遇到的错误,并将错误信息输出到终端或者文件中

buf, err := json.Marshal(request)
if err != nil {
	log.Fatal(err) // log 记录
}

在第三行中,log 可以使用log.Fatal(err) 来记录第一行在json 序列化时所遇到的错误,将该错误信息输出并退出程序

log 也可以搭配不同的输出形式,如:

err := "这是一个log 信息"

log.Println(err)	// 仅输出err 的信息
log.Printf("%v\n", err) // 格式化输出err 的信息
log.Fatalln(err)        // 输出err 的信息,并退出程序
log.Panicln(err)        // 输出err 的信息,并“抛出一个异常”

output:
2022/05/09 13:03:13 这是一个log 信息
2022/05/09 13:03:13 这是一个log 信息
2022/05/09 13:03:13 这是一个log 信息

配置logger

默认情况下logger 只会提供日志的时间信息(如上),如果我们希望获得更多信息,比如:记录该日志的行数和文件名;我们就可以使用log 标准库中定制这些设置的方法来实现

  • 首先了解一下log 标准库flag选项有哪些

    const (
        Ldate         = 1 << iota     // 日期:2009/01/23
        Ltime                         // 时间:01:23:23
        Lmicroseconds                 // 微秒级别的时间:01:23:23.123123(用于增强Ltime位)
        Llongfile                     // 文件全路径名+行号: 
        Lshortfile                    // 文件名+行号:
        LUTC                          // 使用UTC时间
        LstdFlags     = Ldate | Ltime // 标准logger的初始值
    )
    
  • 根据搭配就可配置出简单的输出格式,如:

    err := "这是一个log 信息"
    log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
    log.Println(err)		// 仅输出err 的信息
    
    output:2022/05/09 13:08:26.357721 D:/GoCode/logDemo/main.go:3: 这是一个log 信息
    

配置日志前缀

有时候我们希望在日志信息中加一个前缀,方便后期的检索与处理,就可以使用如下配置方案:

func Prefix() string          // 前缀默认为空
func SetPrefix(prefix string) // 在日志信息前加上[prefix] 字段信息

output:[prefix] xxx(日志信息)

配置日志输出位置

有时候我们不希望在控制台输出日志信息,可以使用SetOutput 函数来设置文件输出的位置:

logFile, err := os.OpenFile("./xx.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) // 同目录下xx.log 文件
if err != nil {
    fmt.Println("open log file failed, err:", err)
    return
}
err := "这是一个log 信息"
log.SetOutput(logFile)
log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
log.Println(err)

总结

以上的配置信息都可以写在init 函数中,方便我们的使用

func init() {
	logFile, err := os.OpenFile("./xx.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.Llongfile | log.Lmicroseconds | log.Ldate)
}

in ./xx.log 信息

[zack]2022/05/09 14:00:23.135978 D:/GoCode/logDemo/02配置logger/main.go:13: 这是一条很普通的日志。
[zack]2022/05/09 14:00:23.136978 D:/GoCode/logDemo/02配置logger/main.go:25: 这是一条很普通的日志。
[zack]2022/05/09 14:00:23.136978 D:/GoCode/logDemo/02配置logger/main.go:27: 这是一条很普通的日志。