From 959dbbd7bf655e9a36a310838dae75b9909f0096 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 5 Nov 2019 11:08:51 +0100 Subject: [PATCH] Avoid circular error in logger --- server/helpers/logger.ts | 30 ++++++++++++++-------- server/initializers/checker-before-init.ts | 4 +-- 2 files changed, 22 insertions(+), 12 deletions(-) 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 error + } + + return value } - - 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( diff --git a/server/initializers/checker-before-init.ts b/server/initializers/checker-before-init.ts index d32ff9b81..9731a0af9 100644 --- a/server/initializers/checker-before-init.ts +++ b/server/initializers/checker-before-init.ts @@ -69,13 +69,13 @@ function checkMissedConfig () { // Check the available codecs // We get CONFIG by param to not import it in this file (import orders) async function checkFFmpeg (CONFIG: { TRANSCODING: { ENABLED: boolean } }) { + if (CONFIG.TRANSCODING.ENABLED === false) return undefined + const Ffmpeg = require('fluent-ffmpeg') const getAvailableCodecsPromise = promisify0(Ffmpeg.getAvailableCodecs) const codecs = await getAvailableCodecsPromise() const canEncode = [ 'libx264' ] - if (CONFIG.TRANSCODING.ENABLED === false) return undefined - for (const codec of canEncode) { if (codecs[codec] === undefined) { throw new Error('Unknown codec ' + codec + ' in FFmpeg.')