From 037efbaba2883624795d76dce894e9ce1c2f8fc9 Mon Sep 17 00:00:00 2001 From: Sven Efftinge Date: Thu, 15 Aug 2019 11:50:50 +0000 Subject: [PATCH] Better output format --- .../src/node/arduino-daemon.ts | 6 +- arduino-ide-extension/src/node/daemon-log.ts | 59 +++++++++++-------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/arduino-ide-extension/src/node/arduino-daemon.ts b/arduino-ide-extension/src/node/arduino-daemon.ts index f5d0365b..767a3452 100644 --- a/arduino-ide-extension/src/node/arduino-daemon.ts +++ b/arduino-ide-extension/src/node/arduino-daemon.ts @@ -14,7 +14,7 @@ import { ToolOutputServiceServer } from '../common/protocol/tool-output-service' export class ArduinoDaemon implements BackendApplicationContribution { // Set this to `true` if you want to connect to a CLI running in debug mode. - static DEBUG_CLI = false; + static DEBUG_CLI = false; @inject(ILogger) @named('daemon') @@ -57,13 +57,13 @@ export class ArduinoDaemon implements BackendApplicationContribution { if (daemon.stdout) { daemon.stdout.on('data', data => { - this.toolOutputService.publishNewOutput('daemon', data.toString()); + this.toolOutputService.publishNewOutput('daemon', DaemonLog.toPrettyString(data.toString())); DaemonLog.log(this.logger, data.toString()); }); } if (daemon.stderr) { daemon.stderr.on('data', data => { - this.toolOutputService.publishNewOutput('daemon error', data.toString()); + this.toolOutputService.publishNewOutput('daemon error', DaemonLog.toPrettyString(data.toString())); DaemonLog.log(this.logger, data.toString()); }); } diff --git a/arduino-ide-extension/src/node/daemon-log.ts b/arduino-ide-extension/src/node/daemon-log.ts index 07b90b21..5c452881 100644 --- a/arduino-ide-extension/src/node/daemon-log.ts +++ b/arduino-ide-extension/src/node/daemon-log.ts @@ -32,36 +32,49 @@ export namespace DaemonLog { const segments = toLog.split('time').filter(s => s.trim().length > 0); for (const segment of segments) { const maybeDaemonLog = parse(`time${segment}`.trim()); - if (is(maybeDaemonLog)) { - const { msg } = maybeDaemonLog; - logger.log(toLogLevel(maybeDaemonLog), msg); - } else { - logger.info(toLog.trim()); + for (const logMsg of maybeDaemonLog) { + logger.log(toLogLevel(logMsg), logMsg.msg); } } } // Super naive. - function parse(toLog: string): string | DaemonLog { - const rawSegments = toLog.split(/(\s+)/) - .map(segment => segment.replace(/['"]+/g, '')) - .map(segment => segment.trim()) - .filter(segment => segment.length > 0); + function parse(toLog: string): DaemonLog[] { + const messages = toLog.split('\ntime='); + const result: DaemonLog[] = []; + for (let i = 0; i < messages.length; i++) { + const msg = (i > 0 ? 'time=' : '') + messages[i]; + const rawSegments = msg.split(/(\s+)/) + .map(segment => segment.replace(/['"]+/g, '')) + .map(segment => segment.trim()) + .filter(segment => segment.length > 0); - const timeIndex = rawSegments.findIndex(segment => segment.startsWith('time=')); - const levelIndex = rawSegments.findIndex(segment => segment.startsWith('level=')); - const msgIndex = rawSegments.findIndex(segment => segment.startsWith('msg=')); - if (rawSegments.length > 2 - && timeIndex !== -1 - && levelIndex !== -1 - && msgIndex !== -1) { - return { - time: rawSegments[timeIndex].split('=')[1], - level: rawSegments[levelIndex].split('=')[1] as Level, - msg: [rawSegments[msgIndex].split('=')[1], ...rawSegments.slice(msgIndex + 1)].join(' ') - } + const timeIndex = rawSegments.findIndex(segment => segment.startsWith('time=')); + const levelIndex = rawSegments.findIndex(segment => segment.startsWith('level=')); + const msgIndex = rawSegments.findIndex(segment => segment.startsWith('msg=')); + if (rawSegments.length > 2 + && timeIndex !== -1 + && levelIndex !== -1 + && msgIndex !== -1) { + result.push({ + time: rawSegments[timeIndex].split('=')[1], + level: rawSegments[levelIndex].split('=')[1] as Level, + msg: [rawSegments[msgIndex].split('=')[1], ...rawSegments.slice(msgIndex + 1)].join(' ') + }); + } else { + result.push({ + time: new Date().toString(), + level: 'info', + msg: msg + }); + } } // Otherwise, log the string as is. - return toLog; + return result; + } + + export function toPrettyString(logMessage: string): string { + const parsed = parse(logMessage); + return parsed.map(msg => `[${msg.level.toUpperCase() || 'INFO'}] ${msg.msg}\n`).join(''); } } \ No newline at end of file