KyleRoss / node-lambda-log

Basic logging mechanism for Node.js Lambda Functions and other AWS services, which produces logs in JSON format for easier reading through Cloudwatch Logs.
https://lambdalog.dev
MIT License
193 stars 16 forks source link

Feature suggestion: default replacer to better handle Error objects passed as meta #31

Closed mfogel closed 3 years ago

mfogel commented 3 years ago

Hi, thanks a bunch for this project. Super helpful.

Right now, when passing Error objects in the meta parameter they get logged as {} because of the design of the Error object (as you know doubt know).

const log = require('lambda-log')
const error = new Error('foo')
log.warn('Heads up!', {error})
// {"_logLevel":"warn","msg":"Heads up!","error":{},"_tags":["log","warn"]}

I can use log.options.replacer to get a much better serialization of the Error object (using the error-to-json package here):

const log = require('lambda-log')
const errorToJson = require('error-to-json').default
log.options.replacer = (key, value) => {
  if (value instanceof Error) return errorToJson(value)
  return value
}

const error = new Error('foo')
log.warn('Heads up!', {error})
// {"_logLevel":"warn","msg":"Heads up!","error":{"name":"Error","message":"foo","stack":"Error: foo\n    at REPL9:1:15\n    at Script.runInThisContext (vm.js:120:18)\n    at REPLServer.defaultEval (repl.js:442:29)\n    at bound (domain.js:427:14)\n    at REPLServer.runBound [as eval] (domain.js:440:12)\n    at REPLServer.onLine (repl.js:777:10)\n    at REPLServer.emit (events.js:326:22)\n    at REPLServer.EventEmitter.emit (domain.js:483:12)\n    at REPLServer.Interface._onLine (readline.js:329:10)\n    at REPLServer.Interface._line (readline.js:658:8)"},"_tags":["log","warn"]}

My suggestion is to consider making this the default behavior. Are there any use cases where serializing an Error to {} would be the better behavior?

Thanks again for the project!

KyleRoss commented 3 years ago

@mfogel Right now, this package will handle Error objects correctly when passed in as the message versus within the meta. I can see the use cases where you may want to pass an error in the meta instead.

I'm trying to keep the number of dependencies within this package as minimal as possible so I think I would like to recreate the functionality of the error-to-json package inside of this one given it's a minimal amount of code.

I'll work on adding this in the next release. Thanks for the feature request!

KyleRoss commented 3 years ago

@mfogel This has been implemented and published in v3.0.0. I'm still waiting on the site to go live with the updated documentation. Thanks for the feature suggestion!

mfogel commented 3 years ago

Thanks @KyleRoss ! Appreciate it very much!

KyleRoss commented 3 years ago

@all-contributors please add @mfogel for ideas

allcontributors[bot] commented 3 years ago

@KyleRoss

I've put up a pull request to add @mfogel! :tada: