diff --git a/lib/debug.js b/lib/debug.js index 969d1222..c70231c9 100644 --- a/lib/debug.js +++ b/lib/debug.js @@ -4,6 +4,7 @@ */ var tty = require('tty'); +var util = require('util'); /** * Expose `debug()` as the module. @@ -16,7 +17,8 @@ module.exports = debug; */ var names = [] - , skips = []; + , skips = [] + , showPID = false; (process.env.DEBUG || '') .split(/[\s,]+/) @@ -25,10 +27,25 @@ var names = [] if (name[0] === '-') { skips.push(new RegExp('^' + name.substr(1) + '$')); } else { - names.push(new RegExp('^' + name + '$')); + if (name == 'PID') { + showPID = true; + } else { + names.push(new RegExp('^' + name + '$')); + } } }); +function isEnabled(name) { + var disabled = skips.some(function(re) { + return re.test(name); + }); + if (disabled) return false; + return names.some(function(re) { + return re.test(name); + }); +} + + /** * Colors. */ @@ -64,6 +81,16 @@ function color() { return colors[prevColor++ % colors.length]; } +function c3(c) { + return '\033[3' + c + 'm'; +} + +function c9(c) { + return '\033[9' + c + 'm'; +} + +var clearColor = '\033[0m'; + /** * Humanize the given `ms`. * @@ -91,45 +118,72 @@ function humanize(ms) { * @api public */ -function debug(name) { - function disabled(){} - disabled.enabled = false; - - var match = skips.some(function(re){ - return re.test(name); - }); +function debug(name, kind, kindColor) { + var log = function disabled(){} + var format = util.format; - if (match) return disabled; + if (isEnabled(name) || (kind && isEnabled(kind + ':' + name))) { + if (kind && kind.length == 4) kind = kind + ' '; - match = names.some(function(re){ - return re.test(name); - }); + if (isatty) { + var c = color() + , pid = showPID ? c9(Number(process.pid) % 7) + process.pid + ' ' + c9(0) : '' + , knd = kind ? c9(kindColor) + kind + ' ' + c9(0) : '' + , pre = ' ' + pid + knd + c9(c) + name + ' ' + c3(c) + c9(0) + , post = ' ' + c3(c) + c9(c) + '+' - if (!match) return disabled; - var c = color(); + log = function colored(fmt) { + var curr = new Date; + var ms = curr - (prev[name] || curr); + prev[name] = curr; - function colored(fmt) { - var curr = new Date; - var ms = curr - (prev[name] || curr); - prev[name] = curr; - - fmt = ' \033[9' + c + 'm' + name + ' ' - + '\033[3' + c + 'm\033[90m' - + fmt + '\033[3' + c + 'm' - + ' +' + humanize(ms) + '\033[0m'; + fmt = new Date().toISOString() + pre + fmt + post + humanize(ms) + clearColor; + process.stderr.write(format.apply(this, arguments) + "\n"); + } + } else { + var pid = showPID ? process.pid + ' ' : '' + , knd = kind ? kind + ' ' : '' + , pre = pid + knd + , post = ' ' + name + ' ' + + log = function plain(fmt) { + fmt = pre + new Date().toISOString() + post + fmt; + process.stderr.write(format.apply(this, arguments) + "\n"); + } + } - console.error.apply(this, arguments); + log.enabled = true; } - function plain(fmt) { - fmt = new Date().toUTCString() - + ' ' + name + ' ' + fmt; - console.error.apply(this, arguments); + if (!kind) { + log.error = debug(name, 'ERROR', 1); + log.debug = debug(name, 'DEBUG', 2); + log.warn = debug(name, 'WARN', 3); + log.info = debug(name, 'INFO', 4); + log.trace = debug(name, 'TRACE', 5); } - colored.enabled = plain.enabled = true; + return log; +} - return isatty - ? colored - : plain; +if (!Date.prototype.toISOString) { + (function() { + function pad(number) { + var r = String(number); + if (r.length === 1) { + r = '0' + r; + } + return r; + } + Date.prototype.toISOString = function() { + return this.getUTCFullYear() + + '-' + pad( this.getUTCMonth() + 1 ) + + '-' + pad( this.getUTCDate() ) + + 'T' + pad( this.getUTCHours() ) + + ':' + pad( this.getUTCMinutes() ) + + ':' + pad( this.getUTCSeconds() ) + + '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) + + 'Z'; + }; + }()); }