I think what you’re missing is format.errors({ stack: true })
in winston.createLogger
.
const logger = winston.createLogger({
level: 'debug',
format: format.combine(
format.errors({ stack: true }),
print,
),
transports: [new transports.Console()],
});
See this GitHub thread for more information.
The reason this is happening is because the interesting Error
object properties, like .stack
, are non-enumerable. Some functions check if the their parameters are Error
instances, like console.error
, and other functions ignore all non-enumerable properties, like winston.<log-level>
and JSON.stringify
.
> console.error(new Error('foo'))
Error: foo
at repl:1:15
at Script.runInThisContext (vm.js:124:20)
...(abbr)
> JSON.stringify(new Error('foo'))
'{}'
All that said, it’s horrible usability to have an error logger essentially ignore errors… I just lost too much time to this.