147 lines
2.7 KiB
JavaScript
147 lines
2.7 KiB
JavaScript
// Copyright 2011 Mark Cavage, Inc. All rights reserved.
|
|
|
|
|
|
|
|
///--- Globals
|
|
|
|
var FMT_STR = '%d-%s-%s %s:%s:%sZ %s - %s: ';
|
|
|
|
var _i = 0;
|
|
var LEVELS = {
|
|
Trace: _i++,
|
|
Debug: _i++,
|
|
Info: _i++,
|
|
Warn: _i++,
|
|
Error: _i++,
|
|
Fatal: _i++
|
|
};
|
|
|
|
var level = 'Info';
|
|
|
|
|
|
|
|
// --- Helpers
|
|
|
|
function pad(val) {
|
|
if (parseInt(val, 10) < 10) {
|
|
val = '0' + val;
|
|
}
|
|
return val;
|
|
}
|
|
|
|
|
|
function format(level, name, args) {
|
|
var d = new Date();
|
|
var fmtStr = args.shift();
|
|
var fmtArgs = [
|
|
d.getUTCFullYear(),
|
|
pad(d.getUTCMonth() + 1),
|
|
pad(d.getUTCDate()),
|
|
pad(d.getUTCHours()),
|
|
pad(d.getUTCMinutes()),
|
|
pad(d.getUTCSeconds()),
|
|
level,
|
|
name
|
|
];
|
|
|
|
args = fmtArgs.concat(args);
|
|
|
|
var output = (FMT_STR + fmtStr).replace(/%[sdj]/g, function(match) {
|
|
switch (match) {
|
|
case '%s': return new String(args.shift());
|
|
case '%d': return new Number(args.shift());
|
|
case '%j': return JSON.stringify(args.shift());
|
|
default:
|
|
return match;
|
|
}
|
|
});
|
|
|
|
return output;
|
|
}
|
|
|
|
|
|
|
|
///--- API
|
|
|
|
function Log(name) {
|
|
this.name = name;
|
|
}
|
|
|
|
Log.prototype._write = function(level, args) {
|
|
var data = format(level, this.name, args);
|
|
console.error(data);
|
|
};
|
|
|
|
Log.prototype.isTraceEnabled = function() {
|
|
return (LEVELS.Trace >= LEVELS[level]);
|
|
};
|
|
|
|
Log.prototype.trace = function() {
|
|
if (this.isTraceEnabled())
|
|
this._write('TRACE', Array.prototype.slice.call(arguments));
|
|
};
|
|
|
|
Log.prototype.isDebugEnabled = function() {
|
|
return (LEVELS.Debug >= LEVELS[level]);
|
|
};
|
|
|
|
Log.prototype.debug = function() {
|
|
if (this.isDebugEnabled())
|
|
this._write('DEBUG', Array.prototype.slice.call(arguments));
|
|
};
|
|
|
|
Log.prototype.isInfoEnabled = function() {
|
|
return (LEVELS.Info >= LEVELS[level]);
|
|
};
|
|
|
|
Log.prototype.info = function() {
|
|
if (this.isInfoEnabled())
|
|
this._write('INFO', Array.prototype.slice.call(arguments));
|
|
};
|
|
|
|
Log.prototype.isWarnEnabled = function() {
|
|
return (LEVELS.Warn >= LEVELS[level]);
|
|
};
|
|
|
|
Log.prototype.warn = function() {
|
|
if (this.isWarnEnabled())
|
|
this._write('WARN', Array.prototype.slice.call(arguments));
|
|
};
|
|
|
|
Log.prototype.isErrorEnabled = function() {
|
|
return (LEVELS.Error >= LEVELS[level]);
|
|
};
|
|
|
|
Log.prototype.error = function() {
|
|
if (this.isErrorEnabled())
|
|
this._write('ERROR', Array.prototype.slice.call(arguments));
|
|
};
|
|
|
|
Log.prototype.isFatalEnabled = function() {
|
|
return (LEVELS.Fatal >= LEVELS[level]);
|
|
};
|
|
|
|
Log.prototype.fatal = function() {
|
|
if (this.isFatalEnabled())
|
|
this._write('FATAL', Array.prototype.slice.call(arguments));
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
|
|
setLevel: function(l) {
|
|
if (LEVELS[l] !== undefined)
|
|
level = l;
|
|
|
|
return level;
|
|
},
|
|
|
|
getLogger: function(name) {
|
|
if (!name || typeof(name) !== 'string')
|
|
throw new TypeError('name (string) required');
|
|
|
|
return new Log(name);
|
|
}
|
|
|
|
};
|