日志库 log库 + zap库介绍
日志库
概念
日志库是用于在开发中记录日志所要用到的库。由于fmt库输出的信息灵活性不够,所以需要日志库提供更好的功能。
log库
参考:Go 每日一库之 log - 大俊的博客 (darjun.github.io)
快速认识
Go 标准库提供了一个日志库log
,可直接使用。log
默认输出到标准错误(stderr
),每条日志前会自动加上日期和时间;每条日志会在新行中输出。
1 |
|
比如上述demo的打印结果如下所示,程序执行到log.Panicf
就会触发程序panic,结束运行,后续log.Fatalf
不会被执行。
1 |
|
log
提供了三组函数:
Print/Printf/Println
:正常输出日志;Panic/Panicf/Panicln
:输出日志后,以拼装好的字符串为参数调用panic
;先输出日志,再调用panic;Fatal/Fatalf/Fatalln
:输出日志后,调用os.Exit(1)
退出程序。
其中,带f
后缀的有格式化功能,带ln
后缀的会在日志后增加一个换行符。
定制
前缀
可以调用log.SetPrefix
为每条日志文本前增加一个前缀。可以调用log.Prefix()
来查看获取当前设置的日志的前缀。例如增加前缀Login:
只需要在日志输出前简单添加log.SetPrefix("Login: ")
。
1 |
|
选项
选项是为日志打印增加日期时间、文件名等信息,调用log.SetFlag
设置选项,可以一次设置多个,例如:
1 |
|
其中选项有以下几种,调用log.Flags()
可以获取当前设置的选项
1 |
|
Ldate
:输出当地时区的日期,如2020/02/07
;Ltime
:输出当地时区的时间,如11:45:45
;Lmicroseconds
:输出的时间精确到微秒,设置了该选项就不用设置Ltime
了。如11:45:45.123123
;Llongfile
:输出长文件名+行号,含包名,如github.com/darjun/go-daily-lib/log/flag/main.go:50
;Lshortfile
:输出短文件名+行号,不含包名,如main.go:50
;LUTC
:如果设置了Ldate
或Ltime
,将输出 UTC 时间,而非当地时区。
log
库还定义了一个Lstdflag
,为Ldate | Ltime
,这是默认的选项。
1 |
|
自定义
log
库使用Logger
结构体作为设计的关键部分,默认情况下创建的是名为std
的Logger
实例。但我们可以对Logger
做一些自定义。调用log.New(...)
来创建Logger
实例,New函数如下所示:
1 |
|
log.New
接受三个参数:
io.Writer
:日志都会写到这个Writer
中;prefix
:前缀,也可以后面调用logger.SetPrefix
设置;flag
:选项,也可以后面调用logger.SetFlag
设置。
可以使用io.MultiWriter
实现多目的地输出,也是一个writer,下面我们将日志同时输出到标准输出、bytes.Buffer
和文件,写一个小小的例子来展示一下自定义Logger的用法:
1 |
|
注意到,第一个参数为io.Writer
,我们。下面我们将日志同时输出到标准输出、bytes.Buffer
和文件中:
实现
log
库的核心是Output
方法。
logrus库
Go 每日一库之 logrus - 大俊的博客 (darjun.github.io)
这是结构化的日志库,kv形式
zap库
golang常用库包:log日志记录-uber的Go日志库zap使用详解 - 九卷 - 博客园 (cnblogs.com)
在 Go 语言中,函数选项模式是一种强大的编码技巧,它可以使函数的调用更加灵活和可配置。
一、函数选项模式的概念 函数选项模式允许你通过一系列的选项来配置一个函数的行为,而不是使用一个庞大的参数列表。这种模式通常使用函数类型的参数来实现,每个函数代表一个选项,可以在调用函数时选择是否应用这些选项。
二、实现函数选项模式的步骤
定义一个结构体,代表函数的可配置选项:
1
2
3
4type Option struct {// 可配置的选项字段
optionField1 int
optionField2 string
}定义一个函数类型,代表选项函数:
type OptionFunc func(*Option)
定义一个接受选项函数的目标函数:
1 |
|
实现选项函数,用于设置选项值:
1
2
3
4
5
6
7
8
9
10
11func WithOptionField1(value int) OptionFunc {
return func(o *Option) {
o.optionField1 = value
}
}
func WithOptionField2(value string) OptionFunc {
return func(o *Option) {
o.optionField2 = value
}
}
三、使用函数选项模式 可以通过以下方式调用目标函数并应用选项:
1 |
|
在这个例子中,TargetFunction
接受一系列的选项函数作为参数,可以根据需要选择应用哪些选项来配置函数的行为。
四、函数选项模式的优点
- 灵活性:可以根据不同的需求轻松地配置函数的行为,而不需要修改函数的签名。
- 可扩展性:可以轻松地添加新的选项,而不会影响现有的代码。
- 可读性:使函数的调用更加清晰,易于理解每个选项的作用。 函数选项模式在 Go 语言中被广泛应用于各种库和框架中,例如 HTTP 服务器、数据库驱动等,以提供更加灵活和可配置的 API。