在日志日志记录中使用结构代替地图

我正在使用 logrus 包登录 Go 项目。要在日志中显示键值对,文档提供以下格式:


log.WithFields(log.Fields{

    "animal": "walrus",

    "size":   10,

  }).Info("A group of walrus emerges from the ocean")

我希望不要在每个日志中手动使用字符串键,而是在所有日志中使用通用结构(以避免键中出现拼写错误的可能性)。


像这样:


type LogMessage struct {

    Status  bool        `json:"status"`

    Message string      `json:"message"`

}


log.WithFields(&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." status=false message="Error User Already Exists"

如何实现这一点?


感谢您的任何帮助!


守着一只汪
浏览 105回答 3
3回答

繁花不似锦

不完全是你需要的,但只是想使用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'}"

潇湘沐

您可以使用自定义包装函数,您可以在其中设置字段键。https://play.golang.org/p/H22M63kn8Jbpackage mainimport (    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 消息=“测试消息”状态=真

qq_花开花谢_0

不能将结构传递给 。它需要类型(基本上是)。为了避免在常用键名称中出错,您可以创建常量 - 这样,如果您在常量名称中输入拼写错误,代码甚至不会编译(最终编写起来会比传递结构更不详细):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(注意:我使用了存档的库“结构”来演示原理。此外,进行转换所需的反射会增加性能成本,因此我不会在程序的性能关键部分使用它)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go