golang標準庫log

2021-12-29 多課網

收錄於話題 #golang 37個

golang標準庫loglog簡介

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 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")
}

輸出結果:

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

自定義logger

log包為我們提供了內置函數,讓我們能自定義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")
}

相關焦點

  • 構建微服務的十大 Golang 框架和庫
    Logrus 是一個適用於 Go(golang) 的結構化記錄器,與標準庫記錄器完全 API 兼容。示例:package mainimport ( log "github.com/sirupsen/logrus")func main() { log.WithFields(log.Fields{ "animal": "walrus", }).Info("A walrus appears")}sirupsen
  • Golang 語言的標準庫 log 包怎麼使用?
    舉例說明,比如在 main 函數中調用 log.Print,方法調用棧為 main->log.Print->*Logger.Output->runtime.Caller,所以此時參數 skip 的值為 2,表示 main 函數中調用 log.Print 的源文件和代碼行號;
  • Golang 實用小技巧合集
    Golang debuglog 庫,調試程序時快捷查看變量值概覽在調試 golang 程序時,加斷點查看變量值固然是一種方法,但更多的時候只是簡單的加個log 看一下。詳見 https://github.com/chinaran/debuglogdebuglog.SpewVal(): 使用 spew 庫列印變量(可以詳細看到結構體每個欄位的定義和值)debuglog.ToJson(): 轉成 json 字符串列印debuglog.ToJsonPretty(): 有縮進和換行的 json 字符串
  • Golang 語言 gRPC 怎麼使用?
    插件安裝方式,具體如下:$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
  • GoHub 更新至 0.6,在線 Golang 文檔閱讀
    {  "Repo": "github.com/golang/go",  "Filename": "doc_zh_CN.go",  "Package": [    {      "Import": "archive/tar",      "Synopsis": "tar包實現了tar格式壓縮文件的存取.
  • 【JavaScript 教程】標準庫—Math 對象
    Math.sqrt(4) Math.sqrt(-4) 2.7、Math.log()Math.log方法返回以e為底的自然對數值。Math.log(Math.E) Math.log(10) 如果要計算以10為底的對數,可以先用Math.log求出自然對數,然後除以Math.LN10;求以2為底的對數,可以除以Math.LN2。
  • golang channel 使用總結
    本文介紹了使用 golang channel 的諸多特性和技巧,已經熟悉了 go 語言特性的小夥伴也可以看看,很有啟發。futures / promisesgolang 雖然沒有直接提供 futrue / promise 模型的操作原語,但通過 goroutine 和 channel 可以實現類似的功能:package mainimport (    "io/ioutil"    "log"    "net/http"
  • Golang開源項目推薦(持續更新)
    image-20211117210349288五、7days-golang7天從零開始的golang程序(web框架Gee、分布式緩存GeeCache、對象關係映射ORM框架GeeORM、rpc框架GeeRPC等)7天用系列Go開始寫
  • gRPC 實操指南(golang)
    (此處需要加入環境變量,各個系統操作不同,不贅述,protoc命令能夠正常使用即可)3.1.3 安裝golang編譯插件我們需要.proto最終生成可用的golang代碼,因而需要獨立安裝golang grpc的插件go get -u github.com/golang/protobuf/protoc-gen-go
  • 使用Golang快速構建WEB應用
    如果發現問題或者有好的建議請回復我我回及時更正。 1.Abstract在學習web開發的過程中會遇到很多困難,因此寫了一篇類似綜述類的文章。作為路線圖從web開發要素的index出發來介紹golang開發的學習流程以及Example代碼。在描述中多是使用代碼來描述使用方法不會做過多的說明。最後可以方便的copy代碼來實現自己的需求。
  • golang下文件鎖的使用
    前言題目是golang下文件鎖的使用,但本文的目的其實是通過golang下的文件鎖的使用方法,來一窺文件鎖背後的機制。
  • 關於 Golang 錯誤處理的一些思考​
    square root of negative number")err2 := fmt.Errorf("math: square root of negative number %g", x)帶有數據的自定義錯誤package serrimport ( "fmt" "github.com/satori/go.uuid" "l
  • Golang 需要避免踩的 50 個坑(二)
    最近準備寫一些關於golang的技術博文,本文是之前在GitHub上看到的golang技術譯文,感覺很有幫助,先給各位讀者分享一下。
  • Golang 語言 Struct 中欄位的 Tag 怎麼使用?
    Golang 語言 method 接收者使用值類型和指針類型的區別Golang 語言怎麼使用 net/http 標準庫開發 http 應用?Golang 語言中 kafka 客戶端庫 sarama參考資料:https://golang.org/pkg/reflect/#StructField https://golang.org/pkg/reflect/#StructTag
  • Golang 語言編程使用接口有哪些好處?
    = nil {  log.Println(err) }}// type GormDB struct {//  db *gorm.DB// }// // func (g *GormDB) Insert(param ...interface{}) {//  g.db.Create(param)// }
  • Golang 調試分析的高階技巧
    本文專注 golang debug 的一些技巧應用,以及相關工具的實用用法,再也不用怕 golang 怎麼調試。你安裝好 golang 之後,執行 go tool 就能看到內置支持的所有工具了。語言對應的彙編代碼了(注意了,命令處理的是 golang 代碼文本),酷。
  • golang 調試分析的高階技巧
    debug 的一些技巧應用,以及相關工具的實用用法,再也不用怕 golang 怎麼調試。你安裝好 golang 之後,執行 go tool 就能看到內置支持的所有工具了。語言對應的彙編代碼了(注意了,命令處理的是 golang 代碼文本),酷。
  • C語言常用標準庫
    有很多工程師喜歡自己封裝一些標準庫已有的函數,其實自己封裝的函數,並不一定比標準庫好,有時候反而代碼更冗餘,且有bug。
  • C語言常用標準庫解讀
    有很多工程師喜歡自己封裝一些標準庫已有的函數,其實自己封裝的函數,並不一定比標準庫好