golang包的日常(2) log包

2021-10-08 23:45:32 字數 4701 閱讀 1029

log包定義了logger型別,該型別提供了一些格式化輸出的方法。

log包中預定義了乙個標準logger物件std,使我們可以直接呼叫函式來列印日誌,預設是標準錯誤輸出(stderr),列印到終端介面。當然也可以自定義建立logger物件,控制std所呼叫的所有函式在內部都是呼叫了同名的logger型別的方法。

函式包括:

示例:

log.

print

("print\n"

)v :=

"printf"

log.

printf

("%s\n"

, v)

log.

println

("println"

)log.

fatalln

("觸發fatal"

)log.

panicln

("觸發panic"

)

輸出:

2020/08

/0913:

41:18 print

2020/08

/0913:

41:18 printf

2020/08

/0913:

41:18 println

2020/08

/0913:

41:18 觸發fatal

log包中預定義的logger物件缺省會列印每條日誌資訊的日期、時間。例子中呼叫fatalln()函式後,列印了日誌資訊,然後程式直接退出。

當我們不滿足於預設的日期和時間,就需要配置logger獲得更多資訊。

log包中可以用setflags()函式來設定std的輸出配置,然後可以用flags()函式來返回std的輸出配置。如果是自定義logger物件,也有同名方法可以使用,呼叫函式本質上是在內部用std呼叫同名方法。

func

flags()

intfunc

setflags

(flag int

)

log包為引數flag定義了一系列常量:

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 // 檔案全路徑名 and line number: /a/b/c/d.go:23

lshortfile // 檔名 and line number: d.go:23. 會覆蓋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

)

lstdflags是標準logger物件std配置的初始值,下面是std的宣告語句:

var std =

new(os.stderr,

"", lstdflags)

示例:

log.

setflags

(log.lshortfile | log.lmicroseconds | log.ldate)

log.

println

("配置之後的日誌"

)

輸出:

2020/08

/0914:

24:52.532449 main.go:

17: 配置之後的日誌

此時檢視其輸出配置:

fmt.

println

(log.

flags()

)// 13

輸出13是因為,llongfile的值是8lmicroseconds的值是4ldate的值1,或運算後得到13

給輸出的日誌新增指定的字首,有助於之後的資訊檢索。

log包中可以用setprefix()函式來設定std的輸出字首,還可以用prefix()函式檢視std的輸出字首。如果是自定義logger物件,也有同名方法可以使用,呼叫函式本質上是在內部用std呼叫同名方法。

示例(logger配置接上例):

log.

setprefix

("[我是字首]"

)log.

println

("帶字首的日誌。"

)fmt.

println

(log.

prefix()

)

輸出:

[我是字首]

2020/08

/0914:

44:05.437154 main.go:

20: 帶字首的日誌。

[我是字首]

log包中可以用setoutput()函式來設定std的輸出目的地,預設是標準錯誤輸出(stderr)。如果是自定義logger物件,也有同名方法可以使用,呼叫函式本質上是在內部用std呼叫同名方法。

示例:

logfile, err := os.

openfile

("t1.log"

0644

)if err !=

nillog.

setoutput

(logfile)

log.

setflags

(log.lshortfile | log.lmicroseconds | log.ldate)

log.

setprefix

("[我是字首]"

)log.

println

("我是日誌。"

)

上例會將日誌輸出到同目錄下的t1.log檔案中。

檔案中的輸出:

[我是字首]

2020/08

/0915:

12:25.340135 main.go:

31: 我是日誌。

如果使用std,可以將配置操作寫到init()函式中。

log包提供了logger物件的建構函式new(),格式如下:

func

new(out io.writer, prefix string

, flag int

)*logger

引數依次是輸出目的地、字首、日誌資訊。

示例:

logger := log.

new(os.stderr,

"", log.lshortfile|log.ldate|log.ltime)

logger.

println

("自定義logger日誌。"

)

輸出:

2020/08

/0915:

25:17 main.go:

33: 自定義logger日誌。

參考

第三方日誌庫logrus

第三方日誌庫zap

Golang內建Log包的基本使用

使用標準logger log包定義了logger型別,該型別提供了一些格式化輸出的方法。本包也提供了乙個預定義的 標準 logger,可以通過呼叫函式print系列 print printf println fatal系 fatal fatalf fatalln 和panic系列 panic pan...

golang匯入包的理解

golang匯入包的理解 程式的初始化和執行都起始於main包。如果main包還匯入了其它的包,那麼就會在編譯時將它們依次匯入。有時乙個包會被多個包同時匯入,那麼它只會被匯入一次 例如很多包可能都會用到fmt包,但它只會被匯入一次,因為沒有必要匯入多次 當乙個包被匯入時,如果該包還匯入了其它的包,那...

golang閉包裡的坑

介紹 go的閉包是乙個很有用的東西。但是如果你不了解閉包是如何工作的,那麼他也會給你帶來一堆的bug。這裡我會拿出go in action這本書的一部分 來說一說在使用閉包的時候可能遇到的坑。全部的 在github上。閉包的坑 首先看一段 search search.go launch a goro...