mirror of
https://github.com/mathew-kurian/Scribe.js
synced 2025-04-24 22:34:58 +00:00
Update index.js
This commit is contained in:
parent
505fd58083
commit
c8bcc35ac9
1 changed files with 101 additions and 79 deletions
180
src/index.js
180
src/index.js
|
@ -5,7 +5,8 @@ var util = require('util')
|
||||||
, moment = require('moment')
|
, moment = require('moment')
|
||||||
, fs = require('fs');
|
, fs = require('fs');
|
||||||
|
|
||||||
var APP_NAME = "AppName";
|
var APP_NAME = "APP_NAME";
|
||||||
|
var LOG_PATH = __dirname + "/log";
|
||||||
|
|
||||||
// Logger information which will be read by the 'overload' function when
|
// Logger information which will be read by the 'overload' function when
|
||||||
// assigning the roles of each I/O scribes.
|
// assigning the roles of each I/O scribes.
|
||||||
|
@ -18,34 +19,13 @@ var loggers = {
|
||||||
// Prinout to console?
|
// Prinout to console?
|
||||||
console: true,
|
console: true,
|
||||||
},
|
},
|
||||||
info: {
|
info: { file: true, console: true },
|
||||||
file: true,
|
error: { file: true, console: true },
|
||||||
console: true
|
warn: { file: true, console: true, },
|
||||||
},
|
realtime: { file: true, console: true },
|
||||||
error: {
|
high: { file: true, console: true },
|
||||||
file: true,
|
normal: { file: true, console: true },
|
||||||
console: true
|
low: { file: true, console: true }
|
||||||
},
|
|
||||||
warn: {
|
|
||||||
file: true,
|
|
||||||
console: true,
|
|
||||||
},
|
|
||||||
realtime: {
|
|
||||||
file: true,
|
|
||||||
console: true
|
|
||||||
},
|
|
||||||
high: {
|
|
||||||
file: true,
|
|
||||||
console: true
|
|
||||||
},
|
|
||||||
normal: {
|
|
||||||
file: true,
|
|
||||||
console: true
|
|
||||||
},
|
|
||||||
low: {
|
|
||||||
file: true,
|
|
||||||
console: true
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
colors : {
|
colors : {
|
||||||
// Console tag colors
|
// Console tag colors
|
||||||
|
@ -60,27 +40,22 @@ var loggers = {
|
||||||
},
|
},
|
||||||
settings : {
|
settings : {
|
||||||
maxTagLength : 30,
|
maxTagLength : 30,
|
||||||
maxLineWidth : 500,
|
|
||||||
preIndent : 5,
|
preIndent : 5,
|
||||||
divider : ' : ',
|
divider : 'W5JZ6WS4GY',
|
||||||
defaultTag : '[' + APP_NAME + ']',
|
defaultTag : '[' + APP_NAME + ']',
|
||||||
userName : 'unkown'
|
userName : 'unkown'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var overload = function() {
|
var logpath = LOG_PATH;
|
||||||
|
|
||||||
// Additional transports
|
var createdir = function(){
|
||||||
console.realtime = console.info;
|
|
||||||
console.high = console.info;
|
|
||||||
console.normal = console.info;
|
|
||||||
console.low = console.info;
|
|
||||||
|
|
||||||
var userName = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'].toLowerCase();
|
var userName = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'].toLowerCase();
|
||||||
loggers.settings.userName = userName.slice(userName.lastIndexOf('\\') + 1);
|
loggers.settings.userName = userName.slice(userName.lastIndexOf('\\') + 1);
|
||||||
|
|
||||||
// Create daily logger directory
|
// Create daily logger directory
|
||||||
var fpath = path.join(__dirname, "log".toLowerCase());
|
var fpath = path.join(LOG_PATH, "log".toLowerCase());
|
||||||
|
|
||||||
// Create daily logger directory
|
// Create daily logger directory
|
||||||
var dailyPath = path.join(fpath, moment().format('MMM_D_YY').toLowerCase());
|
var dailyPath = path.join(fpath, moment().format('MMM_D_YY').toLowerCase());
|
||||||
|
@ -103,8 +78,20 @@ var overload = function() {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return userPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
var overload = function() {
|
||||||
|
|
||||||
|
// Additional transports
|
||||||
|
console.realtime = console.info;
|
||||||
|
console.high = console.info;
|
||||||
|
console.normal = console.info;
|
||||||
|
console.low = console.info;
|
||||||
|
|
||||||
// Assign this variable as write directory
|
// Assign this variable as write directory
|
||||||
fpath = userPath;
|
var dayiso = moment().isoWeekday(); // FIXME Remove this
|
||||||
|
var fpath = logpath = createdir();
|
||||||
|
|
||||||
var _sps = function(sp){
|
var _sps = function(sp){
|
||||||
var s = '';
|
var s = '';
|
||||||
|
@ -119,6 +106,14 @@ var overload = function() {
|
||||||
// that returns a new function that is used instead of the existing
|
// that returns a new function that is used instead of the existing
|
||||||
// function.
|
// function.
|
||||||
console[m] = (function (i) {
|
console[m] = (function (i) {
|
||||||
|
|
||||||
|
// Check if dir up to date
|
||||||
|
var diso = moment().isoWeekday();
|
||||||
|
if(dayiso != diso){
|
||||||
|
fpath = logpath = createdir();
|
||||||
|
dayiso = diso;
|
||||||
|
}
|
||||||
|
|
||||||
// Important to overload instead of override. This way we can
|
// Important to overload instead of override. This way we can
|
||||||
// actually reuse the old function.
|
// actually reuse the old function.
|
||||||
var _backup = console[i];
|
var _backup = console[i];
|
||||||
|
@ -126,13 +121,9 @@ var overload = function() {
|
||||||
// We need to apply any formatting from the variables.
|
// We need to apply any formatting from the variables.
|
||||||
// Notice we don't know the number of arguments, so we
|
// Notice we don't know the number of arguments, so we
|
||||||
// use the 'arguments' variable instead.
|
// use the 'arguments' variable instead.
|
||||||
var utfs = util.format.apply(util, arguments)
|
var utfs = arguments.length == 1 && typeof arguments[0] === 'object' ? JSON.stringify(arguments[0], null, 4) : util.format.apply(util, arguments).trim()
|
||||||
// Moment.js is a great time library for Node.js
|
// Moment.js is a great time library for Node.js
|
||||||
, mtime = moment().format('MMMM Do YYYY, h:mm:ss A')
|
, mtime = moment().format('MMMM Do YYYY, h:mm:ss A')
|
||||||
// Replace any linebreaks and leading/trailing white
|
|
||||||
// space. But we attach a line break at the end to show
|
|
||||||
// each line in the scribe outputs.
|
|
||||||
, ltfs = i == 'log' ? utfs : utfs.replace(/\n/g, '').trim()
|
|
||||||
// Used to show where the tags are to be placed.
|
// Used to show where the tags are to be placed.
|
||||||
// I.e. [Memache] Message goes here.
|
// I.e. [Memache] Message goes here.
|
||||||
// Coldex holds the index of the first ']'
|
// Coldex holds the index of the first ']'
|
||||||
|
@ -140,37 +131,19 @@ var overload = function() {
|
||||||
// The file we are appending to changes everyday since
|
// The file we are appending to changes everyday since
|
||||||
// its directory changes by date.
|
// its directory changes by date.
|
||||||
, file = path.join(fpath, 'app.' + i )
|
, file = path.join(fpath, 'app.' + i )
|
||||||
// Stripped and cleaned string for output to file.
|
|
||||||
// This is different from the console output which has
|
|
||||||
// color formatting. This formatting can cause a lot of
|
|
||||||
// gibberish in textfiles which make it hard to read.
|
|
||||||
// So that is why we strip it out strings that are going
|
|
||||||
// to be saved into the file. Read below for more info
|
|
||||||
// regarding the async/sync formats.
|
|
||||||
, foutstrAsync = ltfs.stripColors + '\n'
|
|
||||||
, foutstrSync = utfs.stripColors.replace(/\n/g, '\n' + _sps(mtime.length + loggers.settings.divider.length)) + '\n'
|
|
||||||
// Default file type
|
// Default file type
|
||||||
, options = { encoding : 'utf8' }
|
, options = { encoding : 'utf8' }
|
||||||
, fullIndent = _sps(loggers.settings.preIndent + loggers.settings.maxTagLength)
|
, fullIndent = _sps(loggers.settings.preIndent + loggers.settings.maxTagLength)
|
||||||
, defaultTagPostIndent = _sps(loggers.settings.maxTagLength - loggers.settings.defaultTag.length)
|
, defaultTagPostIndent = _sps(loggers.settings.maxTagLength - loggers.settings.defaultTag.length)
|
||||||
, temp = ''
|
, temp = ''
|
||||||
, preIndent = _sps(loggers.settings.preIndent);
|
, preIndent = _sps(loggers.settings.preIndent);
|
||||||
|
|
||||||
// Check with logger settings to see if the message should
|
// Check with logger settings to see if the message should
|
||||||
// be outputed to file. Note: Don't append empty lines!
|
// be outputed to file. Note: Don't append empty lines!
|
||||||
if(loggers.types[i].file && ltfs != '')
|
if(loggers.types[i].file && utfs != '')
|
||||||
// Asynchrounous ouput which should not block existing
|
// For large data, block the process when outputting.
|
||||||
// code. Basically, a form of 'process.fork(...)'
|
fs.appendFileSync(file, mtime + loggers.settings.divider +
|
||||||
if(utfs.length < loggers.settings.maxLineWidth)
|
utfs.stripColors.replace(/\n/g, '\n' + mtime + loggers.settings.divider) + "\n", options, function(err){});
|
||||||
// For small data, don't block current process.
|
|
||||||
// NOTE: Fix to Async and Sync
|
|
||||||
// 03/16/2013
|
|
||||||
// FIXED : Problem was the EACH function which wasn't
|
|
||||||
// chaining.
|
|
||||||
// 03/16/2013
|
|
||||||
fs.appendFileSync(file, mtime + loggers.settings.divider + foutstrAsync, options, function(err){});
|
|
||||||
else
|
|
||||||
// For large data, block the process when outputting.
|
|
||||||
fs.appendFileSync(file, mtime + loggers.settings.divider + foutstrSync, options, function(err){});
|
|
||||||
// Check whether the message should be outputed to console.
|
// Check whether the message should be outputed to console.
|
||||||
// Usually, long strings are marked as output ONLY to file
|
// Usually, long strings are marked as output ONLY to file
|
||||||
// and NOT to console. Short and important messages are
|
// and NOT to console. Short and important messages are
|
||||||
|
@ -200,11 +173,7 @@ var overload = function() {
|
||||||
console.info('\n');
|
console.info('\n');
|
||||||
|
|
||||||
for(var i in loggers.types) {
|
for(var i in loggers.types) {
|
||||||
console[i]('========================================================='[i]);
|
console[i]('[' + APP_NAME + ']' + 'Started - console.%s', i.toUpperCase());
|
||||||
console[i]((APP_NAME + ' Server 1 Application.%s | Newline.%s')[i], i.toUpperCase()
|
|
||||||
, [i] == 'log' ? 'DISABLED' : 'ENABLED');
|
|
||||||
console[i](moment().format('LLL')[i]);
|
|
||||||
console[i]('========================================================='[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.info('\n');
|
console.info('\n');
|
||||||
|
@ -215,17 +184,70 @@ var overload = function() {
|
||||||
var logger = function(req, res, next) {
|
var logger = function(req, res, next) {
|
||||||
// Important to see who is accessing what and when
|
// Important to see who is accessing what and when
|
||||||
// Should be a printout of every access and its respective data.
|
// Should be a printout of every access and its respective data.
|
||||||
console.info('[%s]%s %s %s' , req.ip
|
console.info('[%s]%s | %s %s %s' , "Express"
|
||||||
, req.method.red
|
, req.ip.red
|
||||||
, req.url
|
, req.method.green
|
||||||
|
, req.url.grey
|
||||||
, (/mobile/i.test(req.headers['user-agent']) ? 'MOBILE' : 'DESKTOP').yellow);
|
, (/mobile/i.test(req.headers['user-agent']) ? 'MOBILE' : 'DESKTOP').yellow);
|
||||||
|
|
||||||
// Continue with the next process in the Express framework
|
// Continue with the next process in the Express framework
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.overload = overload;
|
var htmltemplate = "";
|
||||||
exports.logger = logger;
|
var css = {};
|
||||||
|
css['html,body'] = 'margin:0; border:none;float:none;display:block;padding:0;font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;background:#1c262f;overflow:hidden;';
|
||||||
|
css['div'] = 'font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;font-size:11px;';
|
||||||
|
css['html'] = 'background:#2A3946;padding:0;padding-left:50px;'
|
||||||
|
css['body'] = 'border-left: 1px solid rgba(255, 255, 255, 0.12);';
|
||||||
|
css['.log-time'] = 'background: none;color: rgba(255, 255, 255, 0.24);padding:2px 5px;margin-right:2px;margin-left:-1px;font-size:11px;';
|
||||||
|
css['.log-type'] = 'background: #633E3E;color: #C20404;padding:2px 5px;margin-right:2px;font-size:11px;';
|
||||||
|
css['.log-line'] = 'height:auto;line-height:15px;color:#BEBEBE;font-size:11px;'
|
||||||
|
css['.button, .selected'] = "font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;background:#2C3338;text-align:center;width:100%;line-height:35px;height:35px;margin-bottom:5px;box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.11);"
|
||||||
|
css['.selected'] = "background:#4D5961;"
|
||||||
|
css['a'] = "background:none;text-decoration:none;font-size: 11px;color: #C2C2C2;padding: 10px;"
|
||||||
|
|
||||||
// Initialize
|
htmltemplate+= "<head><title>TITLE</title><style>"
|
||||||
overload();
|
for(var i in css) htmltemplate+= i + "{" + css[i] + "}";
|
||||||
|
htmltemplate += "</style></head>";
|
||||||
|
var buttons = '<div style = "position:fixed;top:5px;left:5px;width:40px;height:100px;">' +
|
||||||
|
'<div class="button info_selected"><a href="log?type=info">I</a></div>' +
|
||||||
|
'<div class="button log_selected"><a href="log?type=log">L</a></div>' +
|
||||||
|
'<div class="button error_selected"><a href="log?type=error">E</a></div>' +
|
||||||
|
'<div class="button warn_selected"><a href="log?type=warn">W</a></div>' +
|
||||||
|
'<div class="button realtime_selected"><a href="log?type=realtime">Re</a></div>' +
|
||||||
|
'<div class="button high_selected"><a href="log?type=high">Hi</a></div>' +
|
||||||
|
'<div class="button normal_selected"><a href="log?type=normal">No</a></div>' +
|
||||||
|
'<div class="button low_selected"><a href="log?type=low">Lo</a></div>' +
|
||||||
|
'</div>'
|
||||||
|
htmltemplate += '<body style="position:relative;"><div style="position:absolute;left:0;top:0;bottom:0;right:0;"><div style="width:100%;height:100%;overflow:auto;"><div style="width:100%;height:auto;">CONTENT</div></div></div>' + buttons + '</body>';
|
||||||
|
htmltemplate = "<html>" + htmltemplate + "</html>";
|
||||||
|
|
||||||
|
var divRegex = loggers.settings.divider.replace(/([\||\$|\^|\?|\[|\]|\)|\(|\{|\}])/g, '\\$1');
|
||||||
|
var regA = new RegExp('^(.*?)(' + divRegex + ")", 'mg');
|
||||||
|
var regB = new RegExp('^(.*?)' + divRegex + '\\s{0,}\\[(.*?)\\](.*?)$', 'gm')
|
||||||
|
var regC = new RegExp('^(.*?)' + divRegex,'mg');
|
||||||
|
|
||||||
|
var getlog = function(req, res) {
|
||||||
|
var type = req.param('type');
|
||||||
|
type = type ? type : "log";
|
||||||
|
var contents = "No log found";
|
||||||
|
fs.readFile(logpath + "/app." + type, 'utf8', function(err, data) {
|
||||||
|
if (!err) contents = data;
|
||||||
|
// contents = contents.replace(/^(.*?)#\|#/mg, '<span class = "log-time">$1</span>#\|#')
|
||||||
|
contents = contents.replace(/ /g, ' ')
|
||||||
|
contents = contents.replace(regA, '<span class = "log-time">$1</span>$2');
|
||||||
|
contents = contents.replace(regB, '$1<span class = "log-type">$2</span>$3');
|
||||||
|
contents = contents.replace(regC, '$1')
|
||||||
|
contents = contents.replace(/^(.*?)$/mg, '<div class = "log-line">$1</div>')
|
||||||
|
var response = htmltemplate.replace(type + '_', '').replace("CONTENT", contents).replace("TITLE", APP_NAME + " - " + type);
|
||||||
|
res.send(response);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.init = overload;
|
||||||
|
|
||||||
|
exports.express = {
|
||||||
|
'logger' : logger,
|
||||||
|
'getlog' : getlog
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue