3 回答
TA贡献1851条经验 获得超4个赞
不完全是你需要的,但只是想使用fmt提供另一个选项。
log.WithFields(log.Fields{
"info": fmt.Sprintf("%+v", LogMessage{Status: false, Message: "Error User Already Exists"}),
}).Info("User Creation Failed.")
这将产生类似这样的东西
time="2015-03-26T01:27:38-04:00" level=info msg="User Creation Failed." info="{Status:false Message:'Error User Already Exists'}"
TA贡献1816条经验 获得超6个赞
您可以使用自定义包装函数,您可以在其中设置字段键。
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 {
Message string
Status bool
}
func main() {
LogMyMessages(&myMessageStruct{Status: true, Message: "test message"})
}
给出这样的消息
time=“2009-11-10T23:00:00Z” 级别=信息消息=foo 消息=“测试消息”状态=真
TA贡献1835条经验 获得超7个赞
不能将结构传递给 。它需要类型(基本上是)。为了避免在常用键名称中出错,您可以创建常量 - 这样,如果您在常量名称中输入拼写错误,代码甚至不会编译(最终编写起来会比传递结构更不详细):WithFields()Fieldsmap[string]interface{}
const Status = "status"
const Message = "message"
//...
log.WithFields(log.Fields{Status: true, Message: "a message"}).Info("foo")
要实现您想要的精确内容,您需要在传递到 之前将结构转换为映射:WithFields()
import (
structs "github.com/fatih/structs" // ARCHIVED
log "github.com/sirupsen/logrus"
)
//...
type LogMessage struct {
Status bool `json:"status"`
Message 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
(注意:我使用了存档的库“结构”来演示原理。此外,进行转换所需的反射会增加性能成本,因此我不会在程序的性能关键部分使用它)。
- 3 回答
- 0 关注
- 64 浏览
添加回答
举报