log icon indicating copy to clipboard operation
log copied to clipboard

Dynamic Fields With Defer

Open ahshah opened this issue 3 years ago • 1 comments

Hi folks, I'd like to add a field to my logging context after I have some relevant information, I've supplied the peudocode of what I'd like to do. Looking over the code in log/entry.go, this should be pretty straightforward, however it seems like a conscience decision to not allow modification to the Entry structs field variable. Instead, similar functions (i.e WithField) require the building of a new Entry entirely. Why is the Entry struct immutable in this way?

func DownloadFile() (int) { 
   // Off to the network we go
}
func main() {
      ctx := log.WithFields(log.Fields{
          "module": "main",
     })
     defer ctx.Info("Download complete")
     bytesDownloaded := DownloadFile()
     ctx.AddField("downloadSize", bytesDownloaded)
}

ahshah avatar Jan 19 '21 15:01 ahshah

It was meant to be more of a functional API, which I suppose is mostly a personal preference. You should be fine to do:

defer func(){
  ctx.WithField("downloadSize", ...).Info("Download complete")
}()

tj avatar Jan 22 '21 10:01 tj