为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
守着一只汪 2022-10-04 14:18:41
我正在使用 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"如何实现这一点?感谢您的任何帮助!
查看完整描述

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'}"


查看完整回答
反对 回复 2022-10-04
?
潇湘沐

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 消息=“测试消息”状态=真


查看完整回答
反对 回复 2022-10-04
?
qq_花开花谢_0

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

(注意:我使用了存档的库“结构”来演示原理。此外,进行转换所需的反射会增加性能成本,因此我不会在程序的性能关键部分使用它)。


查看完整回答
反对 回复 2022-10-04
  • 3 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信