Skip to content

Commit

Permalink
WRLGS-11: Generic function for timestamp in stderr
Browse files Browse the repository at this point in the history
  • Loading branch information
BourgoisMickael committed Jun 24, 2024
1 parent 60cc71b commit 3bbd78b
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
2 changes: 2 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const API = require('./lib/api.js');
const stderr = require('./lib/stderr');

/*
* For convenience purposes, we provide an already instanciated API; so that
Expand All @@ -11,4 +12,5 @@ module.exports = {
Logger: werelogs.Logger,
configure: werelogs.reconfigure.bind(werelogs),
Werelogs: API,
stderr,
};
95 changes: 95 additions & 0 deletions lib/stderr.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/**
* Prints on stderr a timestamp, the origin and the error
*
* If no other instructions are needed on uncaughtException,
* consider using `catchAndTimestampStderr` directly.
*
* @example
* process.on('uncaughtException', (err, origin) => {
* printErrorWithTimestamp(err, origin);
* // server.close();
* // file.close();
* process.nextTick(() => process.exit(1));
* });
* // Don't forget to timestamp warning
* catchAndTimestampWarning();
* @param {Error} err see process event uncaughtException
* @param {uncaughtException|unhandledRejection} origin see process event
* @param {string} [date=`new Date().toISOString()`] Date to print
*/
function printErrorWithTimestamp(
err, origin, date = new Date().toISOString()
) {
process.stderr.write(`${date}: ${origin}:\n${err.stack}\n`)
}

/**
* Prefer using `catchAndTimestampStderr` instead of this function.
*
* Adds listener for uncaughtException to print with timestamp.
*
* If you want to manage the end of the process, you can set exitCode to null.
* Or you can use `printErrorWithTimestamp` in your own uncaughtException listener.
*
* @param {string} [date=`new Date().toISOString()`] Date to print
* @param {*} [exitCode=1] On uncaughtException, if not null, `process.exit` will
* be called with this value
* @param {string} [date=`new Date().toISOString()`]
* @param {*} [exitCode=1]
*/
function catchAndTimestampUncaughtException(
date = new Date().toISOString(), exitCode = 1
) {
process.on('uncaughtException', function timestampUncaughtException (err, origin) {
printErrorWithTimestamp(err, origin, date);
if (exitCode !== null) {
process.nextTick(() => process.exit(exitCode));
}
})
}

/**
* Forces the use of `--trace-warnings` and adds a date in warning detail
* The warning will be printed by the default `onWarning`
*
* @param {string} [date=`new Date().toISOString()`] Date to print
*/
function catchAndTimestampWarning(date = new Date().toISOString()) {
process.traceProcessWarnings = true;
// must be executed first, before the default `onWarning`
process.prependListener('warning', function timestampWarning (warning) {
if (warning.detail)
warning.detail += `\nAbove Warning Date: ${date}`
else
warning.detail = `Above Warning Date: ${date}`
});
}

/**
* Adds listener for uncaughtException and warning to print them with timestamp.
*
* If you want to manage the end of the process, you can set exitCode to null.
* Or you can use `printErrorWithTimestamp` in your own uncaughtException listener.
*
* @example
* const { catchAndTimestampStderr } = require('werelogs');
* // first instruction in your index.js or entrypoint
* catchAndTimestampStderr();
*
* @param {string} [date=`new Date().toISOString()`] Date to print
* @param {*} [exitCode=1] On uncaughtException, if not null, `process.exit` will
* be called with this value
*/
function catchAndTimestampStderr(
date = new Date().toISOString(), exitCode = 1
) {
catchAndTimestampUncaughtException(date, exitCode);
catchAndTimestampWarning(date);
}

module.exports = {
printErrorWithTimestamp,
catchAndTimestampUncaughtException,
catchAndTimestampWarning,
catchAndTimestampStderr
}

0 comments on commit 3bbd78b

Please sign in to comment.