diff --git a/package-lock.json b/package-lock.json index 18a2c88..5ba4733 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@athenna/logger", - "version": "5.5.0", + "version": "5.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@athenna/logger", - "version": "5.5.0", + "version": "5.6.0", "license": "MIT", "dependencies": { "@aws-lambda-powertools/logger": "^1.18.1", diff --git a/package.json b/package.json index 38f8794..fd9bee6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@athenna/logger", - "version": "5.5.0", + "version": "5.6.0", "description": "The Athenna logging solution. Log in stdout, files and buckets.", "license": "MIT", "author": "João Lenon ", diff --git a/src/drivers/FileDriver.ts b/src/drivers/FileDriver.ts index f81590a..1b5be54 100644 --- a/src/drivers/FileDriver.ts +++ b/src/drivers/FileDriver.ts @@ -7,9 +7,9 @@ * file that was distributed with this source code. */ +import { debug } from '#src/debug' import { File } from '@athenna/common' import { Driver } from '#src/drivers/Driver' -import { debug } from '#src/debug' export class FileDriver extends Driver { public async transport(level: string, message: any): Promise { diff --git a/src/formatters/Formatter.ts b/src/formatters/Formatter.ts index 8b60220..b2349f0 100644 --- a/src/formatters/Formatter.ts +++ b/src/formatters/Formatter.ts @@ -76,6 +76,32 @@ export abstract class Formatter { return new Date(Date.now()).toLocaleString(undefined, localeStringOptions) } + /** + * Get the circular replacer function to be used in + * JSON.stringify(). + */ + public getCircularReplacer() { + const ancestors = [] + + return function (key, value) { + if (!Is.Object(value) || value === null) { + return value + } + + while (ancestors.length > 0 && ancestors.at(-1) !== this) { + ancestors.pop() + } + + if (ancestors.includes(value)) { + return '[Circular]' + } + + ancestors.push(value) + + return value + } + } + /** * Transform the message to string. */ @@ -85,7 +111,7 @@ export abstract class Formatter { } if (Is.Object(message)) { - message = JSON.stringify(message) + message = JSON.stringify(message, this.getCircularReplacer()) } return `${message}` diff --git a/src/formatters/JsonFormatter.ts b/src/formatters/JsonFormatter.ts index 60a66eb..0da46b9 100644 --- a/src/formatters/JsonFormatter.ts +++ b/src/formatters/JsonFormatter.ts @@ -23,9 +23,9 @@ export class JsonFormatter extends Formatter { if (Is.String(message)) { base.msg = message - return JSON.stringify(base) + return JSON.stringify(base, this.getCircularReplacer()) } - return JSON.stringify({ ...base, ...message }) + return JSON.stringify({ ...base, ...message }, this.getCircularReplacer()) } } diff --git a/src/formatters/RequestFormatter.ts b/src/formatters/RequestFormatter.ts index 7066db3..2ae336f 100644 --- a/src/formatters/RequestFormatter.ts +++ b/src/formatters/RequestFormatter.ts @@ -54,6 +54,9 @@ export class RequestFormatter extends Formatter { headers: ctx.response.headers } - return JSON.stringify({ request, response, metadata }) + return JSON.stringify( + { request, response, metadata }, + this.getCircularReplacer() + ) } }