無論是軟體開發的除錯階段還是軟體上線之後的執行階段,日誌一直都是非常重要的乙個環節,我們也應該養成在程式中記錄日誌的好習慣。
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
目錄 四 建立logger 五 總結 go 從入門到放棄完整教程目錄 更有python go pytorch tensorflow 爬蟲 人工智慧教學等著你 更新 更全的 go從入門到放棄 的更新 更有python go 人工智慧教學等著你 無論是軟體開發的除錯階段還是軟體上線之後的執行階段,日誌一...
Go語言之log庫
go語言內建的log包實現了簡單的日誌服務。以下主要介紹log的基本使用 package main import log func main 輸出結果如下 2020 04 0115 27 29 這是一條很普通的日誌。2020 04 0115 27 29 這是一條不正常的日誌。2020 04 0115...
Go標準庫學習筆記 日誌 log
log 模組用於在程式中輸出日誌,它的使用十分簡單,類似於fmt中的print,乙個最簡單的示例如下 package main import log func main 上面的程式會在命令列列印一條日誌 2018 05 16 16 48 06 hello worldlogger是寫入日誌的基本元件,...