golang – log 日誌包

log是 Go 標準庫提供的,不需要另外安裝。可直接使用。它提供了3組函數:

  • Print/Printf/Println:正常輸出日誌;
  • Panic/Panicf/Panicln:輸出日誌後,以拼裝好的字符串為參數調用panic
  • Fatal/Fatalf/Fatalln:輸出日誌後,調用os.Exit(1)退出程序。
import "log"

func main() {
	Name := "howard"
	Age := 11

	log.Printf("%s login, age:%d", Name, Age)
	log.Panicf("Oh, system error when %s login", Name)
	log.Fatalf("Danger! hacker %s login", Name)
}

可在每條輸出的文本前增加一些額外信息,如日期時間、文件名等。

// src/log/lgo.go
const (
	Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
	Ltime                         // the time in the local time zone: 01:23:23
	Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
	Llongfile                     // full file name and line number: /a/b/c/d.go:23
	Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
	LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
	Lmsgprefix                    // move the "prefix" from the beginning of the line to before the message
	LstdFlags     = Ldate | Ltime // initial values for the standard logger
)
  • Ldate:輸出當地時區的日期,如2021/02/07
  • Ltime:輸出當地時區的時間,如12:45:45
  • Lmicroseconds:輸出的時間精確到微秒,設置了該選項就不用設置Ltime了。如12:45:45.123123
  • Llongfile:輸出長文件名+行號,含包名
  • Lshortfile:輸出短文件名+行號,不含包名,如main.go:20
  • LUTC:如果設置了Ldate或Ltime,將輸出 UTC 時間,而非當地時區
func main() {
	Name := "howard"
	Age := 11

	log.SetFlags(log.Lshortfile | log.Ldate | log.Lmicroseconds)

	log.Printf("%s login, age:%d", Name, Age)
  // 輸出: 2023/09/11 16:29:26.833582 log1.go:11: howard login, age:11
}

標準庫log並沒有日誌等級的設定。 如果有用到日誌等級,可以參考 zap 。以及日誌切割 包lumberjack