sgapps-server
Version:
SGApps Network Server
442 lines (382 loc) • 23.3 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>prototypes/logger.js - SGApps Server - Framework</title>
<meta name="description" content="SGApps Server for high performance results" />
<meta name="keywords" content="javascript, js, application-prototype, prototype" />
<meta name="keyword" content="javascript, js, application-prototype, prototype" />
<meta property="og:title" content="SGApps Server - Framework"/>
<meta property="og:type" content="website"/>
<meta property="og:image" content=""/>
<meta property="og:url" content="https://labs.sgapps.io/open-source/sgapps-server"/>
<script src="scripts/prettify/prettify.js"></script>
<script src="scripts/prettify/lang-css.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
<script src="scripts/nav.js" defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
<label for="nav-trigger" class="navicon-button x">
<div class="navicon"></div>
</label>
<label for="nav-trigger" class="overlay"></label>
<nav class="wrap">
<input type="text" id="nav-search" placeholder="Search" />
<h2><a href="index.html">Home</a></h2><h2><a href="https://labs.sgapps.io/open-source/sgapps-server" target="_blank" class="menu-item" id="website_link" >Project Page ( Git Lab )</a></h2><h2><a href="http://gordienco.net/" target="_blank" class="menu-item" id="website_link" >About Me</a></h2><h2><a href="https://labs.sgapps.io/open-source/sgapps-server" target="_blank" class="menu-item" id="github_link" >GitHub</a></h2><h3>Classes</h3><ul><li><a href="AccessLogger.html">AccessLogger</a><ul class='methods'><li data-type='method' style='display: none;'><a href="AccessLogger.html#formattedDate">formattedDate</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getProtocol">getProtocol</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getReferer">getReferer</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getRemoteIp">getRemoteIp</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getSize">getSize</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#getUsername">getUsername</a></li><li data-type='method' style='display: none;'><a href="AccessLogger.html#logRequest">logRequest</a></li></ul></li><li><a href="FaceboxTemplate.html">FaceboxTemplate</a><ul class='methods'><li data-type='method' style='display: none;'><a href="FaceboxTemplate.html#render">render</a></li><li data-type='method' style='display: none;'><a href="FaceboxTemplate.html#renderCode">renderCode</a></li><li data-type='method' style='display: none;'><a href="FaceboxTemplate.html#renderFile">renderFile</a></li></ul></li><li><a href="FSLibrary.html">FSLibrary</a></li><li><a href="LoggerBuilder.html">LoggerBuilder</a><ul class='methods'><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#decorateGlobalLogger">decorateGlobalLogger</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#error">error</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#info">info</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#log">log</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#prettyCli">prettyCli</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#prompt">prompt</a></li><li data-type='method' style='display: none;'><a href="LoggerBuilder.html#warn">warn</a></li></ul></li><li><a href="SGAppsServer.html">SGAppsServer</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServer.html#all">all</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#connect">connect</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#delete">delete</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#Email">Email</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#finalHandler">finalHandler</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#get">get</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handle">handle</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handleErrorRequest">handleErrorRequest</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handlePostData">handlePostData</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handleRequest">handleRequest</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#handleStaticRequest">handleStaticRequest</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#head">head</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#options">options</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#patch">patch</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#post">post</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#put">put</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#server">server</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#trace">trace</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.html#use">use</a></li></ul></li><li><a href="SGAppsServer.NodeJsMvc.html">NodeJsMvc</a></li><li class="level-hide"><a href="SGAppsServer.NodeJsMvc.Controller.html">Controller</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#actionExists">actionExists</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#addAction">addAction</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#addView">addView</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#getAction">getAction</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#getView">getView</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#removeAction">removeAction</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#removeView">removeView</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#render">render</a></li><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.html#viewExists">viewExists</a></li></ul></li><li class="level-hide"><a href="SGAppsServer.NodeJsMvc.Controller.Action.html">Action</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServer.NodeJsMvc.Controller.Action.html#run">run</a></li></ul></li><li><a href="SGAppsServerDecoratorsLibrary.html">SGAppsServerDecoratorsLibrary</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerDecoratorsLibrary.html#.AccessLoggerDecorator">AccessLoggerDecorator</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerDecoratorsLibrary.html#.NodeJsMvcDecorator">NodeJsMvcDecorator</a></li></ul></li><li><a href="SGAppsServerDictionary.html">SGAppsServerDictionary</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerDictionary.html#generatePathKey">generatePathKey</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerDictionary.html#push">push</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerDictionary.html#run">run</a></li></ul></li><li><a href="SGAppsServerEmail.html">SGAppsServerEmail</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#.from">from</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#.isValidAddress">isValidAddress</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#.timeout">timeout</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#send">send</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerEmail.html#valid">valid</a></li></ul></li><li><a href="SGAppsServerRequest.html">SGAppsServerRequest</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerRequest.html#_parseDeepFieldName">_parseDeepFieldName</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerRequest.html#getMountUpdatedUrl">getMountUpdatedUrl</a></li></ul></li><li><a href="SGAppsServerRequestCookie.html">SGAppsServerRequestCookie</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerRequestCookie.html#get">get</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerRequestCookie.html#set">set</a></li></ul></li><li><a href="SGAppsServerRequestSession.html">SGAppsServerRequestSession</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerRequestSession.html#destroy">destroy</a></li></ul></li><li><a href="SGAppsServerResponse.html">SGAppsServerResponse</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#pipeFile">pipeFile</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#pipeFileStatic">pipeFileStatic</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#redirect">redirect</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#send">send</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#sendError">sendError</a></li><li data-type='method' style='display: none;'><a href="SGAppsServerResponse.html#sendStatusCode">sendStatusCode</a></li></ul></li><li><a href="SGAppsServerShared.html">SGAppsServerShared</a></li><li><a href="SGAppsSessionManager.html">SGAppsSessionManager</a><ul class='methods'><li data-type='method' style='display: none;'><a href="SGAppsSessionManager.html#handleRequest">handleRequest</a></li><li data-type='method' style='display: none;'><a href="SGAppsSessionManager.html#removeExpiredSessions">removeExpiredSessions</a></li></ul></li><li><a href="TemplateManager.html">TemplateManager</a><ul class='methods'><li data-type='method' style='display: none;'><a href="TemplateManager.html#add">add</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#addList">addList</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#get">get</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#remove">remove</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#render">render</a></li><li data-type='method' style='display: none;'><a href="TemplateManager.html#templateExists">templateExists</a></li></ul></li><li><a href="TemplateManagerViewer.html">TemplateManagerViewer</a><ul class='methods'><li data-type='method' style='display: none;'><a href="TemplateManagerViewer.html#render">render</a></li><li data-type='method' style='display: none;'><a href="TemplateManagerViewer.html#renderCode">renderCode</a></li></ul></li></ul><h3>Global</h3><ul><li><a href="global.html#LoggerBuilderPrompt">LoggerBuilderPrompt</a></li><li><a href="global.html#MountUpdatedURL">MountUpdatedURL</a></li><li><a href="global.html#RequestHandler">RequestHandler</a></li><li><a href="global.html#RequestPathStructure">RequestPathStructure</a></li><li><a href="global.html#RequestPathStructureMap">RequestPathStructureMap</a></li><li><a href="global.html#RequestSessionDecorator">RequestSessionDecorator</a></li><li><a href="global.html#ResourcesExtensions">ResourcesExtensions</a></li><li><a href="global.html#routeMatch">routeMatch</a></li><li><a href="global.html#SGAppsServerDecorator">SGAppsServerDecorator</a></li><li><a href="global.html#SGAppsServerDictionaryRunCallBack">SGAppsServerDictionaryRunCallBack</a></li><li><a href="global.html#SGAppsServerErrorCallBack">SGAppsServerErrorCallBack</a></li><li><a href="global.html#SGAppsServerErrorOnlyCallback">SGAppsServerErrorOnlyCallback</a></li><li><a href="global.html#SGAppsServerHandlerPostData">SGAppsServerHandlerPostData</a></li><li><a href="global.html#SGAppsServerOptions">SGAppsServerOptions</a></li><li><a href="global.html#SGAppsServerRequestFile">SGAppsServerRequestFile</a></li><li><a href="global.html#SGAppsServerRequestPostDataItem">SGAppsServerRequestPostDataItem</a></li><li><a href="global.html#SGAppsServerRequestSessionCache">SGAppsServerRequestSessionCache</a></li><li><a href="global.html#SGAppsSessionManagerOptions">SGAppsSessionManagerOptions</a></li><li><a href="global.html#TemplateManagerRenderOptions">TemplateManagerRenderOptions</a></li><li><a href="global.html#TemplateManagerTemplate">TemplateManagerTemplate</a></li></ul>
</nav>
<div id="main">
<h1 class="page-title">prototypes/logger.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>var promptCallbacks = [];
process.stdin.on('readable', function () {
var chunk = process.stdin.read();
if (chunk !== null) {
if (promptCallbacks.length) {
var cbs = promptCallbacks;
promptCallbacks = [];
cbs.forEach(function (cb) {
var er;
try {
cb(null, chunk);
} catch (er) {
console.error(er);
}
});
}
}
});
var path = require("path");
var stackList = function () {
var stackReg = /at\s+(.*)\s+\((.*):(\d*):(\d*)\)/i;
var stackReg2 = /at\s+()(.*):(\d*):(\d*)/i;
var stackIndex = 1;
var data = {
method: "anonymous",
path: "unknown",
line: "?",
pos: "?",
file: "unknown",
stack: ""
};
var errorStack = (new Error()).stack.split('\n').slice(3);
var s = errorStack[stackIndex] || errorStack[0],
sp = stackReg.exec(s) || stackReg2.exec(s);
if (sp && sp.length === 5) {
data.method = data.method || sp[1];
data.path = path.relative(process.cwd(), sp[2]);
data.line = sp[3];
data.pos = sp[4];
data.file = (data.path + '').replace(/^[\S\s]*\//, '');
data.stack = errorStack.join('\n');
}
return data;
};
/**
* @example
* // =============================
* // Use Logger as 💻 instance
* // =============================
*
* const { LoggerBuilder } = require('@sgapps.io/server');
*
* const logger = new LoggerBuilder();
*
* logger.log("Hello world");
*
* @example
* // replace default console
*
* const { LoggerBuilder } = require('@sgapps.io/server');
* const logger = new LoggerBuilder();
* logger.decorateGlobalLogger();
*
* console.log("Console Messages are decorated now");
*
* @class
* @name LoggerBuilder
* @description Pretty CLI Logger, with possibility to replace default nodejs' console logger
*/
function LoggerBuilder() {
//@ts-ignore
if (this === global) {
throw Error("LoggerBuilder should be initialized with `new`");
}
//@ts-ignore
this._console = global.console_original || global.console;
/**
* @example
* // Insert an message in VT100 format
* logger._format = "\x1b[7m {{timestamp}} [{{TYPE}}] <{{title}}> {{file}}:{{line}} ({{method}}){{stack}}\x1b[7m";
*
* @memberof LoggerBuilder#
* @description this parameter may be changed if you decide to change decoration schema
* @name _format
* @type {string}
*/
this._format = "\x1b[7m {{timestamp}} [{{TYPE}}] <{{title}}> {{file}}:{{line}} ({{method}}){{stack}}\x1b[7m";
/**
* @memberof LoggerBuilder#
* @name _debug
* @type {boolean}
*/
this._debug = true;
/**
* @memberof LoggerBuilder
* @typedef {object} headerFormatterInfo
* @property {string} time
* @property {string} type
* @property {string} file
* @property {string} line
* @property {string} method
* @property {string} path
* @property {string} stack
*/
/**
* @memberof LoggerBuilder
* @callback headerFormatter
* @param {headerFormatterInfo} info
*/
/**
* @memberof LoggerBuilder#
* @name _headerFormatters
* @type {Array<headerFormatter>}
*/
this._headerFormatters = [];
return this;
}
LoggerBuilder.prototype.pushHeader = function (args, type, stack) {
const data = stackList();
data.time = new Date().toISOString();
data.type = type.toUpperCase();
if (this._headerFormatters.length) {
this._headerFormatters.forEach(handler => {
//@ts-ignore
handler(data);
});
}
let format = this._format;
format = format.replace('{{timestamp}}', data.time);
format = format.replace('{{TYPE}}', data.type);
format = format.replace('{{file}}', data.file);
format = format.replace('{{line}}', data.line);
format = format.replace('{{method}}', data.method);
format = format.replace('{{title}}', data.path);
format = format.replace('{{stack}}', stack ? "\n" + data.stack + "\n" : "");
args.unshift(format);
};
/**
* @memberof LoggerBuilder#
* @method prettyCli
* @param {any} ref
* @param {number} [indent]
* @param {string} [separator=" "]
*/
LoggerBuilder.prototype.prettyCli = function (ref, indent, separator) {
indent = indent || 0;
if (separator === undefined) separator = " ";
let data = '';
if (Array.isArray(ref)) {
data += `\x1b[0m[${
ref
.map(item => this.prettyCli(item, indent + 1, separator))
.map(
(item, index) => `\n${separator}\x1b[0m${item}\x1b[0m${
(index < ref.length - 1) ? ',' : '\n'
}`
).join('')
}\x1b[0m]`;
} else {
switch (typeof(ref)) {
case "boolean":
data += `\x1b[0;34m${ref}\x1b[0m`;
break;
case "function":
data += `\x1b[0;36m${ref}\x1b[0m`;
break;
case "number":
data += `\x1b[0;33m${ref}\x1b[0m`;
break;
case "undefined":
data += `\x1b[0;35m${ref}\x1b[0m`;
break;
case "object":
if (ref === null) {
data += `\x1b[0;35m${ref}\x1b[0m`;
} else if (ref instanceof RegExp) {
data += `\x1b[0;32mRegExp\x1b[34m(\x1b[32m${ref.toString()}\x1b[34m)\x1b[0m`;
} else if (ref instanceof Buffer) {
data += `\x1b[0;32mBuffer\x1b[34m(\x1b[32m${
ref.slice(0,16)
.toString('hex')
.replace(/(.{2})/g, '$1, ')
.replace(/\,\s+$/, '')
.replace(/,/g, '\x1b[0m,\x1b[32m')
}\x1b[0m${
ref.byteLength > 16 ? '...' : ''
}\x1b[34m)\x1b[0m`;
} else {
data += '\x1b[0m{\n';
let prop, firstProp = true;
for (prop in ref) {
if (firstProp) {
firstProp = false;
} else {
data += '\x1b[0m,\n';
}
if (`${prop}`.match(/^[\_\da-zA-Z]+$/)) {
data += `\n${separator}\x1b[0m${prop} \: `;
} else {
data += `\n${separator}\x1b[32m${JSON.stringify(prop)}\x1b[0m] \: `;
}
data += ` ${this.prettyCli(ref[prop], indent + 1, separator)}`;
}
data += '}\x1b[0m';
}
break;
case "string":
default:
data += `\x1b[0;32m${JSON.stringify(ref)}\x1b[0m`;
break;
}
}
if (indent) {
const indentData = '\n' + new Array(indent).fill(separator).join('');
data = indentData + data.replace(/\n/g, indentData);
}
return data;
};
/**
* @memberof LoggerBuilder#
* @method log
* @param {...any} messages
*/
LoggerBuilder.prototype.log = function () {
if (this._debug) {
var args = Array.prototype.slice.call(arguments);
args.unshift("\x1b[0m");
this.pushHeader(args, "log");
args.push('\x1b[0m');
this._console.log.apply(this._console, args);
}
};
/**
* @memberof LoggerBuilder#
* @method info
* @param {...any} messages
*/
LoggerBuilder.prototype.info = function () {
if (this._debug) {
var args = Array.prototype.slice.call(arguments);
args.unshift("\x1b[0;36m ");
this.pushHeader(args, "info");
args.push("\x1b[0m");
this._console.log.apply(this._console, args);
}
};
/**
* @memberof LoggerBuilder#
* @method warn
* @param {...any} messages
*/
LoggerBuilder.prototype.warn = function () {
if (this._debug) {
var args = Array.prototype.slice.call(arguments);
args.unshift("\x1b[0;40;33m ");
this.pushHeader(args, "warn");
args.push("\x1b[0m");
this._console.log.apply(this._console, args);
}
};
/**
* @memberof LoggerBuilder#
* @method error
* @param {...any} messages
*/
LoggerBuilder.prototype.error = function () {
var getStackTrace = function () {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
var args = Array.prototype.slice.call(arguments);
this._console.log("\x1b[0;40;31m");
this.pushHeader(args, "error", true);
this._console.error.apply(this._console, args);
this._console.log(getStackTrace());
this._console.log("\x1b[0m\n");
};
/**
* @callback LoggerBuilderPrompt
* @param {Buffer} message
*/
/**
* @example
* logger.prompt("rerun tests? [y/n]: ", function (err, buffer) {
* // trim spaces from response
* var response = buffer.toString().replace(/^\s*(.*?)\s*$/, '$1');
* if (response === 'y') {
* // write your code
* }
* });
*
* @memberof LoggerBuilder#
* @method prompt
* @param {LoggerBuilderPrompt} callback
* @param {string|Buffer} message
*/
LoggerBuilder.prototype.prompt = function (callback, message) {
if (typeof (message) !== "undefined")
process.stdout.write(message);
promptCallbacks.push(callback);
};
/**
* @memberof LoggerBuilder#
* @method decorateGlobalLogger
*/
LoggerBuilder.prototype.decorateGlobalLogger = function () {
//@ts-ignore
if (!global.console_original) {
//@ts-ignore
global.console_original = {
log: this._console.log,
info: this._console.info,
warn: this._console.warn,
error: this._console.error,
dir: this._console.dir,
time: this._console.time,
timeEnd: this._console.timeEnd,
trace: this._console.trace,
assert: this._console.assert,
Console: this._console.Console
};
global.console.log = this.log;
global.console.info = this.info;
global.console.warn = this.warn;
global.console.error = this.error;
//@ts-ignore
global.console.prompt = this.prompt;
}
};
module.exports = LoggerBuilder;</code></pre>
</article>
</section>
</div>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.5</a> using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
</footer>
<script>prettyPrint();</script>
<script src="scripts/polyfill.js"></script>
<script src="scripts/linenumber.js"></script>
<script src="scripts/search.js" defer></script>
<script src="scripts/collapse.js" defer></script>
<script src="https://sgapps.io/components/sgapps-labs-examples/toolbar/loader.js"></script>
</body>
</html>