视频来源:B站《golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中…]》
一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Go语言自学系列 | 汇总_COCOgsta的博客-CSDN博客_go语言自学
log简介
golang内置了log包,实现简单的日志服务。通过调用log包的函数,可以实现简单的日志打印功能。
log使用
log包中有3个系列的日志打印函数,分别print系列、panic系列、fatal系列。
函数系列 | 作用 |
单纯打印日志 | |
panic | 打印日志,抛出panic异常 |
fatal | 打印日志,强制结束程序(os.Exit(1)),defer函数不会执行 |
实例
package main import ( "fmt" "log" ) func main() { defer fmt.Println("发生了 panic错误!") log.Print("my log") log.Printf("my log %d", 100) name := "tom" age := 20 log.Println(name, " ", age) log.Panic("致命错误!") // log.Fatal("致命错误!") fmt.Println("end...") }
运行结果
[Running] go run "/Users/guoliang/SynologyDrive/软件开发/go/golang入门到项目实战/goproject/360duote.com/pro01/test.go" 2022/05/29 21:11:50 my log 2022/05/29 21:11:50 my log 100 2022/05/29 21:11:50 tom 20 2022/05/29 21:11:50 致命错误! 发生了 panic错误! panic: 致命错误! goroutine 1 [running]: log.Panic({0xc00013ff00, 0x3, 0xc00013ff00}) /usr/local/go/src/log/log.go:354 +0x65 main.main() /Users/guoliang/SynologyDrive/软件开发/go/golang入门到项目实战/goproject/360duote.com/pro01/test.go:15 +0x19e exit status 2
log配置
标准log配置
默认情况下log只会打印出时间,但是实际情况下我们还需要获取文件名,行号等信息,log包提供给我们定制的接口。
log包提供两个标准log配置的相关方法:
func Flags() int // 返回标准log输出配置 func SetFlags(flag int) // 设置标准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 main import ( "fmt" "log" ) func main() { i := log.Flags() fmt.Printf("i: %v\n", i) log.SetFlags(log.Ldate | log.Ltime | log.Llongfile) log.Print("my log") }
输出结果:
[Running] go run "/Users/guoliang/SynologyDrive/软件开发/go/golang入门到项目实战/goproject/360duote.com/pro01/test.go" i: 3 2022/05/29 21:27:41 /Users/guoliang/SynologyDrive/软件开发/go/golang入门到项目实战/goproject/360duote.com/pro01/test.go:12: my log
日志前缀配置
log包提供两个日志前缀配置的相关函数:
func Prefix() string // 返回日志的前缀配置 func SetPrefix(prefix string) // 设置日志前缀
日志前缀配置实例
package main import ( "fmt" "log" ) func main() { s := log.Prefix() fmt.Printf("s: %v\n", s) log.SetPrefix("MyLog: ") s = log.Prefix() fmt.Printf("s: %v\n", s) log.Print("my log...") }
输出结果:
[Running] go run "/Users/guoliang/SynologyDrive/软件开发/go/golang入门到项目实战/goproject/360duote.com/pro01/test.go" s: s: MyLog: MyLog: 2022/05/29 21:36:16 my log...
日志输出位置配置
前面介绍的都是将日志输出到控制台上,golang的log包还支持将日志输出到文件中,log包提供了func SetOutput(w io.Writer)函数,将日志输出到文件中。
日志输出位置配置
package main import ( "log" "os" ) func main() { f, err := os.OpenFile("a.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { log.Panic("打开日志文件异常") } log.SetOutput(f) log.Print("my log...") }
结果:日志输出到当前目录下 a.log文件中
2022/05/29 21:41:46 my log...
自定义logger
log包为我们提供了内置含糊,让我们能自定义logger。从效果上来看,就是将标题3中的标准日志配置、日志前缀配置、日志输出位置配置整合到一个函数中,使日志配置不在那么繁琐。
log包中提供了func New(out io.Writer, prefix string, flag int) *Logger函数来实现自定义logger。
示例
package main import ( "log" "os" ) var logger *log.Logger func init() { logFile, err := os.OpenFile("a.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { log.Panic("打开日志文件异常") } logger = log.New(logFile, "success", log.Ldate | log.Ltime | log.Lshortfile) } func main() { logger.Println("自定义logger") }
结果:日志输出到当前目录下的a.log文件中
success2022/05/29 21:48:31 test.go:19: 自定义logger