Comparing version 0.6.0 to 0.7.0
105
index.js
@@ -22,2 +22,6 @@ 'use strict'; | ||
var _console_log = console.log.bind(console), | ||
_console_warn = console.warn.bind(console), | ||
_console_error = console.error.bind(console); | ||
function timerCallback(thing) { | ||
@@ -38,2 +42,30 @@ if (typeof thing._repeat === 'function') { return '_repeat'; } | ||
var log = (function () { | ||
var util; | ||
var fns = { }; | ||
function log(/*type, args...*/) { | ||
// lazy load so we can define this early but don't cause any requires | ||
// until after we've hooked things or don't care | ||
util = util || require('util'); | ||
var i = arguments.length, args = new Array(i); | ||
while (i--) { args[i] = arguments[i]; } | ||
var type = args.shift(), str = util.format.apply(util, args); | ||
return fns[type](str); | ||
} | ||
log.setLogger = function setLogger(type, fn) { | ||
fns[type] = fn; | ||
}; | ||
log.resetLoggers = function resetLoggers() { | ||
fns = { | ||
'info': _console_log, | ||
'warn': _console_warn, | ||
'error': _console_error | ||
}; | ||
}; | ||
log.resetLoggers(); | ||
return log; | ||
})(); | ||
// hook stuff | ||
@@ -109,3 +141,2 @@ (function () { | ||
// to be a way around that :( | ||
var consolelog = console.log.bind(console); | ||
function wrapFn(fn, name, isInterval, callback) { | ||
@@ -330,3 +361,3 @@ if (typeof fn !== 'function') { return fn; } | ||
if (!DONT_INSTRUMENT[name]) { | ||
console.warn('Unable to determine callsite for "'+name+'". Did you require `wtfnode` at the top of your entry point?'); | ||
log('warn', 'Unable to determine callsite for "'+name+'". Did you require `wtfnode` at the top of your entry point?'); | ||
} | ||
@@ -339,3 +370,3 @@ return { name: '(anonymous)', file: 'unknown', line: 0 }; | ||
function dump() { | ||
console.log('[WTF Node?] open handles:'); | ||
log('info', '[WTF Node?] open handles:'); | ||
@@ -365,3 +396,3 @@ // sort the active handles into different types for logging | ||
if (fds.length) { | ||
console.log('- File descriptors: (note: stdio always exists)'); | ||
log('info', '- File descriptors: (note: stdio always exists)'); | ||
fds.forEach(function (s) { | ||
@@ -372,3 +403,3 @@ var str = ' - fd '+s.fd; | ||
if (s.destroyed) { str += ' (destroyed)'; } | ||
console.log(str); | ||
log('info', str); | ||
@@ -378,6 +409,6 @@ // this event will source the origin of a readline instance, kind of indirectly | ||
if (keypressListeners && keypressListeners.length) { | ||
console.log(' - Listeners:'); | ||
log('info', ' - Listeners:'); | ||
keypressListeners.forEach(function (fn) { | ||
var callSite = getCallsite(fn); | ||
console.log(' - %s: %s @ %s:%d', 'keypress', fn.name || fn.__name || callSite.name || '(anonymous)', callSite.file, callSite.line); | ||
log('info', ' - %s: %s @ %s:%d', 'keypress', fn.name || fn.__name || callSite.name || '(anonymous)', callSite.file, callSite.line); | ||
}); | ||
@@ -398,9 +429,9 @@ } | ||
if (processes.length) { | ||
console.log('- Child processes'); | ||
log('info', '- Child processes'); | ||
processes.forEach(function (cp) { | ||
var fds = [ ]; | ||
console.log(' - PID %s', cp.pid); | ||
log('info', ' - PID %s', cp.pid); | ||
if (!DONT_INSTRUMENT['ChildProcess']) { | ||
var callSite = getCallsite(cp); | ||
console.log(' - Entry point: %s:%d', callSite.file, callSite.line); | ||
log('info', ' - Entry point: %s:%d', callSite.file, callSite.line); | ||
} | ||
@@ -416,3 +447,3 @@ if (cp.stdio && cp.stdio.length) { | ||
if (fds && fds.length) { | ||
console.log(' - STDIO file descriptors:', fds.join(', ')); | ||
log('info', ' - STDIO file descriptors:', fds.join(', ')); | ||
} | ||
@@ -424,8 +455,8 @@ } | ||
if (clusterWorkers.length) { | ||
console.log('- Cluster workers'); | ||
log('info', '- Cluster workers'); | ||
clusterWorkers.forEach(function (cw) { | ||
var fds = [ ], cp = cw.__worker.process; | ||
console.log(' - PID %s', cp.pid); | ||
log('info', ' - PID %s', cp.pid); | ||
var callSite = getCallsite(cw); | ||
console.log(' - Entry point: %s:%d', callSite.file, callSite.line); | ||
log('info', ' - Entry point: %s:%d', callSite.file, callSite.line); | ||
}); | ||
@@ -435,19 +466,19 @@ } | ||
if (sockets.length) { | ||
console.log('- Sockets:'); | ||
log('info', '- Sockets:'); | ||
sockets.forEach(function (s) { | ||
if (s.destroyed) { | ||
console.log(' - (?:?) -> %s:? (destroyed)', s._host); | ||
log('info', ' - (?:?) -> %s:? (destroyed)', s._host); | ||
} else if (s.localAddress) { | ||
console.log(' - %s:%s -> %s:%s', s.localAddress, s.localPort, s.remoteAddress, s.remotePort); | ||
log('info', ' - %s:%s -> %s:%s', s.localAddress, s.localPort, s.remoteAddress, s.remotePort); | ||
} else if (s._handle && (s._handle.fd != null)) { | ||
console.log(' - fd %s', s._handle.fd); | ||
log('info', ' - fd %s', s._handle.fd); | ||
} else { | ||
console.log(' - unknown socket'); | ||
log('info', ' - unknown socket'); | ||
} | ||
var connectListeners = s.listeners('connect'); | ||
if (connectListeners && connectListeners.length) { | ||
console.log(' - Listeners:'); | ||
log('info', ' - Listeners:'); | ||
connectListeners.forEach(function (fn) { | ||
var callSite = getCallsite(fn); | ||
console.log(' - %s: %s @ %s:%d', 'connect', fn.name || fn.__name || callSite.name || '(anonymous)', callSite.file, callSite.line); | ||
log('info', ' - %s: %s @ %s:%d', 'connect', fn.name || fn.__name || callSite.name || '(anonymous)', callSite.file, callSite.line); | ||
}); | ||
@@ -459,3 +490,3 @@ } | ||
if (servers.length) { | ||
console.log('- Servers:'); | ||
log('info', '- Servers:'); | ||
servers.forEach(function (s) { | ||
@@ -480,5 +511,5 @@ var type = 'unknown type'; | ||
if (a) { | ||
console.log(' - %s:%s (%s)', a.address, a.port, type); | ||
log('info', ' - %s:%s (%s)', a.address, a.port, type); | ||
} else { | ||
console.log(' - <unknown address>'); // closed / race condition? | ||
log('info', ' - <unknown address>'); // closed / race condition? | ||
} | ||
@@ -496,6 +527,6 @@ | ||
if (listeners && listeners.length) { | ||
console.log(' - Listeners:'); | ||
log('info', ' - Listeners:'); | ||
listeners.forEach(function (fn) { | ||
var callSite = getCallsite(fn); | ||
console.log(' - %s: %s @ %s:%d', eventType, fn.name || fn.__name || callSite.name || '(anonymous)', callSite.file, callSite.line); | ||
log('info', ' - %s: %s @ %s:%d', eventType, fn.name || fn.__name || callSite.name || '(anonymous)', callSite.file, callSite.line); | ||
}); | ||
@@ -547,3 +578,3 @@ } | ||
if (timers.length) { | ||
console.log('- Timers:'); | ||
log('info', '- Timers:'); | ||
@@ -554,3 +585,3 @@ timers.forEach(function (t) { | ||
console.log(' - (%d ~ %s) %s @ %s:%d', t._idleTimeout, formatTime(t._idleTimeout), fn.name || fn.__name || callSite.name || '(anonymous)', callSite.file, callSite.line); | ||
log('info', ' - (%d ~ %s) %s @ %s:%d', t._idleTimeout, formatTime(t._idleTimeout), fn.name || fn.__name || callSite.name || '(anonymous)', callSite.file, callSite.line); | ||
}); | ||
@@ -560,3 +591,3 @@ } | ||
if (intervals.length) { | ||
console.log('- Intervals:'); | ||
log('info', '- Intervals:'); | ||
@@ -567,3 +598,3 @@ intervals.forEach(function (t) { | ||
console.log(' - (%d ~ %s) %s @ %s:%d', t._idleTimeout, formatTime(t._idleTimeout), fn.name || fn.__name || callSite.name, callSite.file, callSite.line); | ||
log('info', ' - (%d ~ %s) %s @ %s:%d', t._idleTimeout, formatTime(t._idleTimeout), fn.name || fn.__name || callSite.name, callSite.file, callSite.line); | ||
}); | ||
@@ -573,7 +604,7 @@ } | ||
if (other.length) { | ||
console.log('- Others:'); | ||
log('info', '- Others:'); | ||
other.forEach(function (o) { | ||
if (!o) { return; } | ||
if (o.constructor) { console.log(' - %s', o.constructor.name); } | ||
else { console.log(' - %s', o); } | ||
if (o.constructor) { log('info', ' - %s', o.constructor.name); } | ||
else { log('info', ' - %s', o); } | ||
}); | ||
@@ -588,3 +619,3 @@ } | ||
try { dump(); } | ||
catch (e) { console.error(e); } | ||
catch (e) { log('error', e); } | ||
process.exit(); | ||
@@ -597,3 +628,5 @@ }); | ||
dump: dump, | ||
init: init | ||
init: init, | ||
setLogger: log.setLogger, | ||
resetLoggers: log.resetLoggers | ||
}; | ||
@@ -603,3 +636,3 @@ | ||
if (process.argv.length < 3) { | ||
console.error('Usage: wtfnode <yourscript> <yourargs> ...'); | ||
log('error', 'Usage: wtfnode <yourscript> <yourargs> ...'); | ||
process.exit(1); | ||
@@ -606,0 +639,0 @@ } |
{ | ||
"name": "wtfnode", | ||
"version": "0.6.0", | ||
"version": "0.7.0", | ||
"description": "Utility to help find out why Node isn't exiting", | ||
@@ -16,3 +16,3 @@ "repository": { | ||
"scripts": { | ||
"test": "(cd tests && node test && node test-eval && node test-promisify)", | ||
"test": "(cd tests && node test && node test-eval && node test-promise && node test-promisify && node test-logging)", | ||
"test-sourcemaps": "(cd tests && coffee --map --compile test-sourcemaps.coffee && node test-sourcemaps.js || exit 0)", | ||
@@ -19,0 +19,0 @@ "kitchensink": "(cd tests && node kitchensink)" |
@@ -55,2 +55,18 @@ # What? | ||
## Configuring logging | ||
`wtfnode` uses three logging levels, which default to `console.log`, `console.warn`, and `console.error`. The output is sent to `console.log`; warnings about potential problems when calculating the output are sent to `console.warn`; `console.error` is currently only used to print CLI usage info. | ||
You can set these functions to an arbitrary log function of your own. It will be passed data in the same way that console.log receives it, so if you want a plain string you should call `util.format.apply(util, args)` on the data you receive. | ||
Usage: | ||
```js | ||
var wtf = require('wtfnode'); | ||
wtf.setLogger('info', function (...) { ... }); | ||
wtf.setLogger('warn', function (...) { ... }); | ||
wtf.setLogger('error', function (...) { ... }); | ||
wtf.resetLoggers(); // if you want to put them back for some reason | ||
``` | ||
# Caution | ||
@@ -57,0 +73,0 @@ |
28867
580
80