golang內置了log包,實現簡單的日誌服務。通過調用log包的函數,可以實現簡單的日誌列印功能。
log使用log包中有3個系列的日誌列印函數,分別print系列、panic系列、fatal系列。
函數系列作用print單純列印日誌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...")
}結果示例(實際結果不是這樣的哦,因為panic,fatal會影響程序的執行):
2021/11/29 16:45:59 my log
2021/11/29 16:45:59 my log 100
2021/11/29 16:45:59 tom , 20
2021/11/29 16:45:59 致命錯誤!
發生了 panic錯誤!
panic: 致命錯誤!
goroutine 1 [running]:
log.Panic({0xc000107f00, 0x3, 0xc000107f00})
C:/Program Files/Go/src/log/log.go:354 +0x65
main.main()
c:/Users/52406/Desktop/golangprojects/duoke360.com/pro01/demo.go:15 +0x19e
exit status 2log配置標準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")
}輸出結果:
i: 3
2021/11/29 16:49:53 c:/Users/52406/Desktop/golangprojects/duoke360.com/pro01/demo.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...")
}輸出結果:
s:
s: MyLog:
MyLog: 2021/11/29 16:51:55 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文件中
2021/11/29 16:57:13 my log...自定義loggerlog包為我們提供了內置函數,讓我們能自定義logger。從效果上來看,就是將標題3中的標準日誌配置、日誌前綴配置、日誌輸出位置配置整合到一個函數中,使日誌配置不在那麼繁瑣。log包中提供了func New(out io.Writer, prefix string, flag int) *Logger函數來實現自定義logger。
示例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")
}