共计 3624 个字符,预计需要花费 10 分钟才能阅读完成。
这篇文章给大家介绍 Go 语言标准库中的 log 该如何理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
Go 语言标准库中的 log 介绍
1.log
1.1 使用 Logger
log 包定义了 Logger 类型,该类型提供了一些格式化输出的方法。
本包也提供了一个预定义的 标准 logger, 可以通过调用 Print 系列(Print|Printf|Println)、Fatal 系列(Fatal|Fatalf|fatalln)和 Panic 系列(Panic|Panicf|PanicLn)来使用,比自行创建一个 logger 对象更容易使用。
例如:我们可以像下面的代码一样,直接通过 log 包来调用上岸提到的方法,默认它们会把日志信息大隐刀终端界面。
package mainimport ( log)func main() { log.Println( 这是一条很普通的日志。) v := 很普通的 log.Printf(这是一条 %s 日志。\n , v) log.Fatalln(这是一条会触发 fatal 的日志。) log.Panicln(这是一条会触发 panic 的日志。)}结果:2020/02/06 21:57:13 这是一条很普通的日志。2020/02/06 21:57:13 这是一条很普通的日志。2020/02/06 21:57:13 这是一条会触发 fatal 的日志。Process finished with exit code 1
logger 会打印每条日志信息的日期、时间,默认输出到系统的标准错误。
Fatal 系列函数会写入日志信息后调用 os.Exit(1)。
Panic 系列函数会在写入日志信息后 panic。
1.2 配置 logger
1.2.1 标准 logger 的配置
默认情况下的 logger 只会提供日志的时间信息,但是很多情况下,我们希望得到更多信息,比如记录该日志的文件名和行号等。
log 标准库中为我们提供了定制这些设置的方法。
log 标准库中的 Flags 函数会返回标准 logger 的输出配置,而 SetFlags 函数是用来设置标准 logger 的输出配置。
func Flags() int
func SetFlags(flag int)
flag 选项
log 标准库提供了如下的 flag 选项,它们是一系列定义好的常量。
const (
// 控制输出日志信息的细节,不能控制输出的顺序和格式。
// 输出的日志在每一项后会有一个冒号分隔:例如 2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
Ldate = 1 iota // 日期:2009/01/23
Ltime // 时间:01:23:23
Lmicroseconds // 微秒级别的时间:01:23:23.123123(用于增强 Ltime 位)
Llongfile // 文件全路径名 + 行号:/a/b/c/d.go:23
Lshortfile // 文件名 + 行号:d.go:23(会覆盖掉 Llongfile)
LUTC // 使用 UTC 时间
LstdFlags = Ldate | Ltime // 标准 logger 的初始值
)
package mainimport ( log)func main() { // 设置 logger log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate) log.Println(这是一条很普通的日志。)}结果:2020/02/06 22:20:40.508109 /Users/tongchao/Desktop/gopath/src/test/test.go:10: 这是一条很普通的日志。Process finished with exit code 0
1.2.2 配置日志前缀
log 标准库中还提供了关于日志信息前缀的两个方法:
func Prefix() string // 查看标准 logger 的输出前缀
func SetPrefix(prefix string) // 设置输出前缀
package mainimport ( log)func main() { // 设置 logger log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate) log.Println(这是一条很普通的日志。) log.SetPrefix([前缀信息] ) log.Println(这是一条很普通的日志。)}结果:2020/02/06 22:25:27.654416 /Users/tongchao/Desktop/gopath/src/test/test.go:10: 这是一条很普通的日志。[前缀信息]2020/02/06 22:25:27.654601 /Users/tongchao/Desktop/gopath/src/test/test.go:12: 这是一条很普通的日志。Process finished with exit code 0
这样可以在日志信息中添加指定的前缀,方便之后对日志信息进行检索和处理。
1.2.3 配置日志输出位置
func SetOutput(w io.Writer)
setOutput 函数用来设置标准 logger 的输出目的地,默认是标准错误输出。
把日志输出到同目录下的 xx.log 文件中。
package mainimport ( fmt log os)func main() { 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) log.Println(这是一条很普通的日志。) log.SetPrefix([前缀信息] ) log.Println(这是一条很普通的日志。)}
结果:
xx.log 中内容为
2020/02/06 22:30:22.369892 /Users/tongchao/Desktop/gopath/src/test/test.go:17: 这是一条很普通的日志。
[前缀信息]2020/02/06 22:30:22.370229 /Users/tongchao/Desktop/gopath/src/test/test.go:19: 这是一条很普通的日志。
如果要使用标准的 logger,会把上面的配置操作写到 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)}
1.3 创建 logger
log 标准库中还提供了创建新 logger 对象的构造函数 New,支持我们自己创建 logger 示例。
New 函数的签名如下:
func New(out io.Writer, prefix string, flag int) *Logger
New 创建一个 Logger 对象。其中,参数 out 设置日志信息写入的目的地。参数 prefix 会添加到生成的每一条日志前面。参数 flag 定义日志的属性(时间、文件等等)。
package mainimport ( log os)func main() { logger := log.New(os.Stdout, New , log.Lshortfile|log.Ldate|log.Ltime) logger.Println(这是自定义的 logger 记录的日志。)}
结果:
New 2020/02/06 22:34:17 test.go:10: 这是自定义的 logger 记录的日志。
Process finished with exit code 0
Go 内置的 log 库功能有限,不能满足不同级别日志的情况,我们在实际的项目中根据自己的需要选择第三方日志库,如 logrus–https://github.com/sirupsen/logrus,zap–https://github.com/uber-go/zap 等
关于 Go 语言标准库中的 log 该如何理解就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。