Go語言標準庫之log

2022-02-22 20:49:04 字數 3440 閱讀 2195

目錄

四、建立logger

五、總結

go 從入門到放棄完整教程目錄(更有python、go、pytorch、tensorflow、爬蟲、人工智慧教學等著你):

更新、更全的《go從入門到放棄》的更新**,更有python、go、人工智慧教學等著你:

無論是軟體開發的除錯階段還是軟體上線之後的執行階段,日誌一直都是非常重要的乙個環節,我們也應該養成在程式中記錄日誌的好習慣。

go語言內建的log包實現了簡單的日誌服務。本文介紹了標準庫log的基本使用。

log包定義了logger型別,該型別提供了一些格式化輸出的方法。本包也提供了乙個預定義的「標準」logger,可以通過呼叫函式print系列(print|printf|println)、fatal系列(fatal|fatalf|fatalln)、和panic系列(panic|panicf|panicln)來使用,比自行建立乙個logger物件更容易使用。

例如,我們可以像下面的**一樣直接通過log包來呼叫上面提到的方法,預設它們會將日誌資訊列印到終端介面:

package main

import (

"log"

)func main()

編譯並執行上面的**會得到如下輸出:

2017/06/19 14:04:17 這是一條很普通的日誌。

2017/06/19 14:04:17 這是一條很普通的日誌。

2017/06/19 14:04:17 這是一條會觸發fatal的日誌。

logger會列印每條日誌資訊的日期、時間,預設輸出到系統的標準錯誤。fatal系列函式會在寫入日誌資訊後呼叫os.exit(1)。panic系列函式會在寫入日誌資訊後panic。

預設情況下的logger只會提供日誌的時間資訊,但是很多情況下我們希望得到更多資訊,比如記錄該日誌的檔名和行號等。log標準庫中為我們提供了定製這些設定的方法。

log標準庫中的flags函式會返回標準logger的輸出配置,而setflags函式用來設定標準logger的輸出配置。

func flags() int

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

llongfile // 檔案全路徑名+行號: /a/b/c/d.go:23

lshortfile // 檔名+行號:d.go:23(會覆蓋掉llongfile)

lutc // 使用utc時間

lstdflags = ldate | ltime // 標準logger的初始值

)

下面我們在記錄日誌之前先設定一下標準logger的輸出選項如下:

func main()
編譯執行後得到的輸出結果如下:

2017/06/19 14:05:17.494943 .../log_demo/main.go:11: 這是一條很普通的日誌。
log標準庫中還提供了關於日誌資訊字首的兩個方法:

func prefix() string

func setprefix(prefix string)

其中prefix函式用來檢視標準logger的輸出字首,setprefix函式用來設定輸出字首。

func main()
上面的**輸出如下:

[小王子]2017/06/19 14:05:57.940542 .../log_demo/main.go:13: 這是一條很普通的日誌。
這樣我們就能夠在**中為我們的日誌資訊新增指定的字首,方便之後對日誌資訊進行檢索和處理。

func setoutput(w io.writer)
setoutput函式用來設定標準logger的輸出目的地,預設是標準錯誤輸出。

例如,下面的**會把日誌輸出到同目錄下的xx.log檔案中。

func main() 

log.setoutput(logfile)

log.setflags(log.llongfile | log.lmicroseconds | log.ldate)

log.println("這是一條很普通的日誌。")

log.setprefix("[小王子]")

log.println("這是一條很普通的日誌。")

}

如果你要使用標準的logger,我們通常會把上面的配置操作寫到init函式中。

func init() 

log.setoutput(logfile)

log.setflags(log.llongfile | log.lmicroseconds | log.ldate)

}

log標準庫中還提供了乙個建立新logger物件的建構函式–new,支援我們建立自己的logger示例。new函式的簽名如下:

func new(out io.writer, prefix string, flag int) *logger
new建立乙個logger物件。其中,引數out設定日誌資訊寫入的目的地。引數prefix會新增到生成的每一條日誌前面。引數flag定義日誌的屬性(時間、檔案等等)。

舉個例子:

func main()
將上面的**編譯執行之後,得到結果如下:

2017/06/19 14:06:51 main.go:34: 這是自定義的logger記錄的日誌。
go內建的log庫功能有限,例如無法滿足記錄不同級別日誌的情況,我們在實際的專案中根據自己的需要選擇使用第三方的日誌庫,如logrus、zap等。

Go語言標準庫log介紹

無論是軟體開發的除錯階段還是軟體上線之後的執行階段,日誌一直都是非常重要的乙個環節,我們也應該養成在程式中記錄日誌的好習慣。go語言內建的log包實現了簡單的日誌服務。本文介紹了標準庫log的基本使用。log包定義了logger型別,該型別提供了一些格式化輸出的方法。本包也提供了乙個預定義的 標準 ...

Go語言標準庫之flag

go語言內建的flag包實現了命令列引數的解析,flag包使得開發命令列工具更為簡單。如果你只是簡單的想要獲取命令列引數,可以像下面的 示例一樣使用os.args來獲取命令列引數。package main import fmt os os.args demo func main 將上面的 執行go ...

Go語言標準庫之strconv

go語言中strconv包實現了基本資料型別和其字串表示的相互轉換。更多函式請檢視官方文件。這一組函式是我們平時程式設計中用的最多的。將字串型別的整數轉換為int型別。func atoi s string i int,err error 如果傳入的字串引數無法轉換為int型別,就會返回錯誤。s1 1...