From 959dbbd7bf655e9a36a310838dae75b9909f0096 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 5 Nov 2019 11:08:51 +0100 Subject: Avoid circular error in logger --- server/helpers/logger.ts | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'server/helpers/logger.ts') diff --git a/server/helpers/logger.ts b/server/helpers/logger.ts index 8603dd761..d21746963 100644 --- a/server/helpers/logger.ts +++ b/server/helpers/logger.ts @@ -12,22 +12,33 @@ const label = CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT // FIXME: use async mkdirpSync(CONFIG.STORAGE.LOG_DIR) -function loggerReplacer (key: string, value: any) { - if (value instanceof Error) { - const error = {} +function getLoggerReplacer () { + const seen = new WeakSet() - Object.getOwnPropertyNames(value).forEach(key => error[ key ] = value[ key ]) + // Thanks: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value#Examples + return (key: string, value: any) => { + if (typeof value === 'object' && value !== null) { + if (seen.has(value)) return - return error - } + seen.add(value) + } + + if (value instanceof Error) { + const error = {} + + Object.getOwnPropertyNames(value).forEach(key => error[ key ] = value[ key ]) - return value + return error + } + + return value + } } const consoleLoggerFormat = winston.format.printf(info => { const obj = omit(info, 'label', 'timestamp', 'level', 'message') - let additionalInfos = JSON.stringify(obj, loggerReplacer, 2) + let additionalInfos = JSON.stringify(obj, getLoggerReplacer(), 2) if (additionalInfos === undefined || additionalInfos === '{}') additionalInfos = '' else additionalInfos = ' ' + additionalInfos @@ -36,7 +47,7 @@ const consoleLoggerFormat = winston.format.printf(info => { }) const jsonLoggerFormat = winston.format.printf(info => { - return JSON.stringify(info, loggerReplacer) + return JSON.stringify(info, getLoggerReplacer()) }) const timestampFormatter = winston.format.timestamp({ @@ -47,7 +58,6 @@ const labelFormatter = winston.format.label({ }) const fileLoggerOptions: FileTransportOptions = { - filename: path.join(CONFIG.STORAGE.LOG_DIR, 'peertube.log'), handleExceptions: true, format: winston.format.combine( -- cgit v1.2.3