log简介
golang 内置了 log 包,实现简单的日志服务,通过调用 log 包的函数,可以实现简单的日志打印功能
log使用
| 函数系列 | 作用 |
|---|---|
| 单纯打印日志 | |
| panic | 打印日志,抛出panic异常 |
| fatal | 打印日志,强制结束程序( os.Exit(1) ), defer 函数不会执行 |
实例
package main
import (
"fmt"
"log"
)
func test1() {
log.Print("my log")
log.Printf("my log %d", 100)
name := "tom"
age := 20
log.Println(name, " ", age)
}
func test2() {
defer fmt.Println("panic 结束后再执行")
log.Print("my log")
log.Panic("my panic") // 抛出异常 程序结束(函数返回执行defer) end...不会输出
fmt.Println("end...")
}
func test3() {
defer fmt.Println("defer...")
log.Print("my log")
log.Fatal("fatal") // os.exit(1)退出系统 函数不返回 不会执行defer
fmt.Println("end...")
}
func main() {
// test1()
// test2()
test3()
}
log配置
标准log配置
默认情况下 log 只会打印出时间,但是实际情况下我们可能还需要获取文件名、行号信息, log 包提供给我们定制的接口。
log 包提供两个标准的 log 配置相关方法
func Flags() in // 返回标准log输出配置
func SerFlags(flag int) // 设置标准log输出配置
flag参数
const (
// 控制输出日志信息的细节,不能控制输出的顺序和格式
// 输出的日志再每一项后会有一个冒号分隔,例如2009/1/23 01:23:23 /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 test3() {
defer fmt.Println("defer...")
log.Print("my log")
log.Fatal("fatal") // os.exit(1)退出系统 函数不返回 不会执行defer
fmt.Println("end...")
}
func init() {
log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
// 还可以添加前缀
log.SetPrefix("MyLog: ")
}
func main() {
test3()
}
/*
MyLog: 2022/12/20 11:19:12 d:/Code/go_project/day1/log/log.go:25: my log
MyLog: 2022/12/20 11:19:12 d:/Code/go_project/day1/log/log.go:26: fatal
*/
日志输出位置配置
package main
import (
"fmt"
"log"
"os"
)
func test3() {
defer fmt.Println("defer...")
log.Print("my log")
log.Fatal("fatal") // os.exit(1)退出系统 函数不返回 不会执行defer
fmt.Println("end...")
}
func init() {
log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
// 还可以添加前缀
log.SetPrefix("MyLog: ")
f, err := os.OpenFile("a.log", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0664)
// defer f.Close()
if err != nil {
log.Fatal("日志文件错误")
}
log.SetOutput(f)
}
func main() {
test3()
}
自定义logger
log 包为我们提供了内置函数,让我们能自定义 logger 。从效果上看,就是将标准日志配置、日志前缀配置、日志输入位置配置整合到一个函数中,使日志配置不再那么繁琐。
log 包提供了如下函数自定义 logger
func New(out io.Writer, prefix string, flag int *Logger)
示例:
package main
import (
"log"
"os"
)
var logger *log.Logger
func init() {
f, err := os.OpenFile("a.log", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0664)
if err != nil {
log.Fatal("日志文件错误")
}
logger = log.New(f, "Mylog: ", log.Ldate|log.Ltime|log.Llongfile)
}
func main() {
logger.Print("my log")
}