tsedio / logger

📄 A multi channel logger written in TypeScript.
https://logger.tsed.io
MIT License
61 stars 24 forks source link

feat: automatic error formatting in json layout #224

Open EinfachHans opened 10 months ago

EinfachHans commented 10 months ago

Informations

Type  Version
Improvement 6.6.3

Description

I'm currently in process of understanding the logger and how it works. I have problems with a usefull error formatting:

For production i enabled the json layout. See the following comparison, between what i log and what the output is:

Log Response
this.logger.error('some error', exception) {"startTime":"2023-11-14T14:30:30.024Z","categoryName":"ExceptionsFilter","level":"ERROR","data":["some error"]}
this.logger.error(exception) {"startTime":"2023-11-14T14:31:21.042Z","categoryName":"ExceptionsFilter","level":"ERROR","data":[]}
this.logger.error({ message: 'some error', exception }) {"startTime":"2023-11-14T14:32:23.111Z","categoryName":"ExceptionsFilter","level":"ERROR","message":"some error","exception":{},"data":[]}

In all of this variants the information about the exception (new Error('test') in my case) is missing.

What would i expect? Good question. When a error ocours the default context logger logs something like this:

{"startTime":"2023-11-14T14:32:23.113Z","categoryName":"Default","level":"ERROR","method":"GET","url":"/healthz","route":"/healthz","headers":{...},"body":{},"query":{},"params":{},"reqId":"f3dc11e567e24389b9847d7321643533","time":"2023-11-14T14:32:23.113Z","duration":9,"event":"request.end","status":500,"status_code":"500","state":"KO","error_name":"Error","error_message":"test","error_stack":"...","data":[]}

This information is explicit added by the PlatformLogMiddleware of @tsed. Maybe it would make sense something similar to the logger itself? Maybe here? Where when an error is detected within the data it could be handled separately.

Or is this not a good solution for some reasons? Then i would have to implement something in my application.

EinfachHans commented 10 months ago

Hey @Romakita , did you see this issue? 😃 Just noticed that you are not automatically assigned here

Romakita commented 10 months ago

Hello @EinfachHans I haven't found this issue.

The problem is around the error object itself (detecting will be a huge cost, because we need to introspect object and nested object), JSON.stringify isn't able to serialize the error instance because Error.prototype haven't a toJSON method. We can see that here:

Capture d’écran 2023-11-18 à 09 41 39

Reading this article explain how it's possible to serialize error: https://zirkelc.dev/posts/stringify-and-parse-errors-in-javascript.

The problem is how to support that correctly for all possible Error type (and custom Error) without exposing critical information of our application (Error.stack ??). This is actually why I haven't fixed this problem on logger level.

Note: @tsed/logger code base was originally based on log4js, and the team haven't fixed that ^^

EinfachHans commented 10 months ago

Hey @Romakita,

thanks for the explanation! Yeah already thought it is going to be a larger thing 😩

For know i will write a custom logic in my app the works for me 👍🏼

Romakita commented 10 months ago

You can monkey patch the Exception.prototype.toJSON until we haven’t a good solution ;)