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
的值是8
,lmicroseconds
的值是4
,ldate
的值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...