我正在使用logrus包在Go專案中進行日志記錄。 為了在日志中顯示鍵值對,檔案中給出了以下格式:
log.WithFields(log.Fields{
"animal": "walrus",
"size": 10。
}).Info("一群海象從海中出現")
我希望在所有的日志中使用一個共同的結構,而不是在每個日志中手動使用字串鍵(以避免鍵的打錯機會)。
像這樣:
type LogMessage struct {
狀態 bool `json: "status"`
訊息 string `json: "message"`
}
log.WithFields(&LogMessage {Status: false, Message: "Error User Already Exists"}).Info("用戶創建失敗。")
日志輸出應該是:
time="2015-03-26T01:27:38-04:00" level=info msg="用戶創建失敗。 " status=false message="Error User Already Exists"。
如何實作?
謝謝您的幫助!
uj5u.com熱心網友回復:
你不能向WithFields()傳遞一個結構。它需要Fields型別(基本上是map[string]interface{})。為了避免常見的鍵名出錯,你可以創建常量--這樣的話,如果你在常量名稱中打錯字,代碼甚至不會被編譯(而且最后寫出來的東西會比傳遞一個結構更省事):
const Status = "status"
const Message = " message"
//...
log.WithFields(log.Fields{Status: true, Message: "a message"}).Info("foo")
為了準確地實作你想要的東西,你需要在傳遞給WithFields()之前將struct轉換為map:
import (
結構 "github.com/fatih/structs" // ARCHIVED
日志 "github.com/sirupsen/logrus"
)
//...
type LogMessage struct {
狀態 bool `json: "status"`
訊息 string `json: "message"`
}
log.WithFields(structs.Map(&LogMessage{Status: true, Message: "a message"}).Info("foo")
// will output:.
// Time="2009-11-10T23:00:00Z" level=info msg=foo Message="a message" Status=true
(注意:我使用了存檔的庫 "structs",只是為了演示原理。此外,進行轉換所需的反射增加了性能成本,所以我不會在程式的性能關鍵部分使用這個方法)。
uj5u.com熱心網友回復:
你可以使用一個自定義的包裝函式,你可以在里面設定你的欄位鍵。
https://play.golang.org/p/H22M63kn8Jb
package main
import (
log "github.com/sirupsen/logrus"
)
func LogMyMessages( messageStruct *myMessageStruct) {
log.WithFields(log.Fields{"status": messageStruct.Status, "message": messageStruct.Message})。Info("foo")
}
type myMessageStruct struct {
訊息 string
狀態 bool func main() {
LogMyMessages(&myMessageStruct{Status: true, Message: "test message"})
}
給出一個這樣的訊息
time="2009-11-10T23:00:00Z" level=info msg=foo message="test message" status=true轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/313744.html
標籤:
