diff --git a/src/cloudron.js b/src/cloudron.js index 9270b66a2..b9c0b65b4 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -295,7 +295,8 @@ function getLogs(unit, options, callback) { // need to handle box.log without subdir if (unit === 'box') args.push(path.join(paths.LOG_DIR, 'box.log')); - else args.push(path.join(paths.LOG_DIR, unit, 'app.log')); + else if (unit.startsWith('crash-')) args.push(path.join(paths.CRASH_LOG_DIR, unit.slice(6) + '.log')); + else return callback(new CloudronError(CloudronError.BAD_FIELD, 'No such unit')); var cp = spawn('/usr/bin/tail', args); diff --git a/src/crashnotifier.js b/src/crashnotifier.js index b8b1b9ab4..4e556c2e0 100644 --- a/src/crashnotifier.js +++ b/src/crashnotifier.js @@ -45,13 +45,13 @@ function sendFailureLogs(unitName, callback) { logs = util.format('Failed to collect logs.', error); } - const crashLogFile = `${new Date().toISOString()}.log`; - console.log(`Sending failure logs for ${unitName} at ${crashLogFile}`); + const crashId = `${new Date().toISOString()}`; + console.log(`Creating crash log for ${unitName} with id ${crashId}`); - if (!safe.fs.writeFileSync(path.join(paths.CRASH_LOG_DIR, crashLogFile), logs)) console.log(`Failed to stash logs to ${crashLogFile}:`, safe.error); + if (!safe.fs.writeFileSync(path.join(paths.CRASH_LOG_DIR, `${crashId}.log`), logs)) console.log(`Failed to stash logs to ${crashLogFile}:`, safe.error); - eventlog.add(eventlog.ACTION_PROCESS_CRASH, AUDIT_SOURCE, { processName: unitName, crashLogFile: crashLogFile }, function (error) { - if (error) console.log(`Error sending crashlog. Logs stashed at ${crashLogFile}`); + eventlog.add(eventlog.ACTION_PROCESS_CRASH, AUDIT_SOURCE, { processName: unitName, crashId: crashId }, function (error) { + if (error) console.log(`Error sending crashlog. Logs stashed at ${crashId}.log`); safe.fs.writeFileSync(CRASH_LOG_TIMESTAMP_FILE, String(Date.now())); diff --git a/src/notifications.js b/src/notifications.js index e9f5f07b9..93bc30cb3 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -224,21 +224,21 @@ function appDied(eventId, app, callback) { }, callback); } -function processCrash(eventId, processName, crashLogFile, callback) { +function processCrash(eventId, processName, crashId, callback) { assert.strictEqual(typeof eventId, 'string'); assert.strictEqual(typeof processName, 'string'); - assert.strictEqual(typeof crashLogFile, 'string'); + assert.strictEqual(typeof crashId, 'string'); assert.strictEqual(typeof callback, 'function'); var subject = `${processName} exited unexpectedly`; - var crashLogs = safe.fs.readFileSync(path.join(paths.CRASH_LOG_DIR, crashLogFile), 'utf8') || `No logs found at ${crashLogFile}`; + var crashLogs = safe.fs.readFileSync(path.join(paths.CRASH_LOG_DIR, crashId, '.log'), 'utf8') || `No logs found at ${crashId}.log`; // also send us a notification mail if (config.provider() === 'caas') mailer.unexpectedExit('support@cloudron.io', subject, crashLogs); actionForAllAdmins([], function (admin, callback) { mailer.unexpectedExit(admin.email, subject, crashLogs); - add(admin.id, eventId, subject, `The service has been restarted automatically. Crash logs are available [here](/logs.html?crash=${crashLogFile})`, callback); + add(admin.id, eventId, subject, `The service has been restarted automatically. Crash logs are available [here](/logs.html?crashId=${crashId}).`, callback); }, callback); } @@ -315,7 +315,7 @@ function onEvent(id, action, source, data, callback) { case eventlog.ACTION_APP_DOWN: return appDied(id, data.app, callback); case eventlog.ACTION_APP_UP: return appUp(id, data.app, callback); case eventlog.ACTION_APP_TASK_CRASH: return apptaskCrash(id, data.appId, data.crashLogFile, callback); - case eventlog.ACTION_PROCESS_CRASH: return processCrash(id, data.processName, data.crashLogFile, callback); + case eventlog.ACTION_PROCESS_CRASH: return processCrash(id, data.processName, data.crashId, callback); default: return callback(); } }