15.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 main

import (
    "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 main

import (
    "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 main

import (
    "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 main

import (
    "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 main

import (
    "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等
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章