diff --git a/src/backend/src/Extension.js b/src/backend/src/Extension.js index 227b3e2ea..f303c76be 100644 --- a/src/backend/src/Extension.js +++ b/src/backend/src/Extension.js @@ -282,7 +282,8 @@ class Extension extends AdvancedBase { get console () { const extensionConsole = Object.create(console); extensionConsole.log = (...a) => { - console.log(`${display_time(new Date())} \x1B[${this.terminal_color};1m(extension/${this.name})\x1B[0m`, ...a); + const realConsole = globalThis.original_console_object ?? console; + realConsole.log(`${display_time(new Date())} \x1B[${this.terminal_color};1m(extension/${this.name})\x1B[0m`, ...a); }; return extensionConsole; } diff --git a/src/backend/src/modules/core/LogService.js b/src/backend/src/modules/core/LogService.js index bea09b850..efd8f3da1 100644 --- a/src/backend/src/modules/core/LogService.js +++ b/src/backend/src/modules/core/LogService.js @@ -122,7 +122,7 @@ class LogContext { typeof fields[k].toLogFields === 'function' ) fields[k] = fields[k].toLogFields(); } - if ( Context.get('injected_logger') ) { + if ( Context.get('injected_logger', { allow_fallback: true }) ) { Context.get('injected_logger').log( message + (fields ? ('; fields: ' + JSON.stringify(fields)) : ''), ); @@ -557,6 +557,31 @@ class LogService extends BaseService { this.services.logger = this.create('services-container'); globalThis.root_context.set('logger', this.create('root-context')); + + { + const util = require('util'); + const logger = this.create('console'); + + if ( ! globalThis.original_console_object ) { + globalThis.original_console_object = console; + } + + // Keep console prototype + const logconsole = Object.create(console); + + // Override simple log functions + const logfn = level => (...a) => { + logger[level](a.map(arg => { + if ( typeof arg === 'string' ) return arg; + return util.inspect(arg, undefined, undefined, true); + }).join(' ')); + }; + logconsole.log = logfn('info'); + logconsole.warn = logfn('warn'); + logconsole.error = logfn('error'); + + globalThis.console = logconsole; + } } /** diff --git a/src/backend/src/modules/web/WebServerService.js b/src/backend/src/modules/web/WebServerService.js index 86452b001..4f4640bc5 100644 --- a/src/backend/src/modules/web/WebServerService.js +++ b/src/backend/src/modules/web/WebServerService.js @@ -685,6 +685,7 @@ class WebServerService extends BaseService { */ // comment above line 497 print_puter_logo_() { + const realConsole = globalThis.original_console_object; if ( this.global_config.env !== 'dev' ) return; const logos = require('../../fun/logos.js'); let last_logo = undefined; @@ -703,10 +704,10 @@ class WebServerService extends BaseService { lines[i] = ' '.repeat(pad_left) + lines[i] + ' '.repeat(pad_right); } const txt = lines.join('\n'); - console.log('\n\x1B[34;1m' + txt + '\x1B[0m\n'); + realConsole.log('\n\x1B[34;1m' + txt + '\x1B[0m\n'); } if ( config.os.archbtw ) { - console.log('\x1B[34;1mPuter is running on Arch btw\x1B[0m'); + realConsole.log('\x1B[34;1mPuter is running on Arch btw\x1B[0m'); } } } diff --git a/src/backend/src/services/NullDevConsoleService.js b/src/backend/src/services/NullDevConsoleService.js index 6e449c0a9..874635760 100644 --- a/src/backend/src/services/NullDevConsoleService.js +++ b/src/backend/src/services/NullDevConsoleService.js @@ -31,34 +31,36 @@ class NullDevConsoleService extends BaseService { const longestWithTitle = Math.max(longest, ansi_visible_length(title)); + const realConsole = globalThis.original_console_object ?? console; + ({ highlighter: () => { - console.log(`\x1B[${colors.bginv}m▐\x1B[0m\x1B[${colors.bg}m ${title} \x1B[0m`); + realConsole.log(`\x1B[${colors.bginv}m▐\x1B[0m\x1B[${colors.bg}m ${title} \x1B[0m`); for ( const line of lines ) { - console.log(`\x1B[${colors.bginv}m▐▌\x1B[0m${line}\x1B[0m`); + realConsole.log(`\x1B[${colors.bginv}m▐▌\x1B[0m${line}\x1B[0m`); } }, highlighter2: () => { let top = ''; for ( let i = title.length + 2; i < longest+3; i++ ) top += `\x1B[${colors.bginv}m▁\x1B[0m`; - console.log(`\x1B[${colors.bginv}m▐\x1B[0m\x1B[${colors.bg}m ${title}${top || ' '}\x1B[0m`); + realConsole.log(`\x1B[${colors.bginv}m▐\x1B[0m\x1B[${colors.bg}m ${title}${top || ' '}\x1B[0m`); for ( const line of lines ) { const diff = line.length - ansi_visible_length(line); - console.log(`\x1B[${colors.bginv}m▐▌\x1B[0m${line.padEnd(longest + diff)}` + + realConsole.log(`\x1B[${colors.bginv}m▐▌\x1B[0m${line.padEnd(longest + diff)}` + `\x1B[${colors.bginv}m▐\x1B[0m`); } - console.log(` \x1B[${colors.bginv}m${Array(longest + 2).fill('▔').join('')}\x1B[0m`); + realConsole.log(` \x1B[${colors.bginv}m${Array(longest + 2).fill('▔').join('')}\x1B[0m`); }, stars: () => { const len = longestWithTitle + 1; const horiz = Array(len).fill('*').join(''); - console.log(`\x1B[${colors.bginv}m**${horiz}**\x1B[0m`); - console.log(`\x1B[${colors.bginv}m*\x1B[0m ${(title + ':').padEnd(len)} \x1B[${colors.bginv}m*\x1B[0m`); + realConsole.log(`\x1B[${colors.bginv}m**${horiz}**\x1B[0m`); + realConsole.log(`\x1B[${colors.bginv}m*\x1B[0m ${(title + ':').padEnd(len)} \x1B[${colors.bginv}m*\x1B[0m`); for ( const line of lines ) { const diff = line.length - ansi_visible_length(line); - console.log(`\x1B[${colors.bginv}m*\x1B[0m ${line.padEnd(len + diff)} \x1B[${colors.bginv}m*\x1B[0m`); + realConsole.log(`\x1B[${colors.bginv}m*\x1B[0m ${line.padEnd(len + diff)} \x1B[${colors.bginv}m*\x1B[0m`); } - console.log(`\x1B[${colors.bginv}m**${horiz}**\x1B[0m`); + realConsole.log(`\x1B[${colors.bginv}m**${horiz}**\x1B[0m`); }, })[style ?? 'highlighter2'](); }