Fix bunyan -p ...
(i.e. DTrace integration) on node 4.x and 5.x
This never worked with node >0.x because of faulty logic determining `nodeSpawnSupportsStdio` -- attempting to compare with, e.g., `Number('v1')`. Fixes #370
This commit is contained in:
parent
97026eb4e9
commit
778d0f7049
4 changed files with 65 additions and 7 deletions
|
@ -8,6 +8,8 @@ Known issues:
|
||||||
|
|
||||||
## 1.8.0 (not yet released)
|
## 1.8.0 (not yet released)
|
||||||
|
|
||||||
|
- [issue #370] Fix `bunyan -p ...` (i.e. DTrace integration) on node
|
||||||
|
4.x and 5.x.
|
||||||
- [issue #329, pull #330] Update the 'rotating-file' stream to do a file
|
- [issue #329, pull #330] Update the 'rotating-file' stream to do a file
|
||||||
rotation on initialization if the mtime on the file path indicates the
|
rotation on initialization if the mtime on the file path indicates the
|
||||||
last rotation time was missed -- i.e. if the app wasn't running at the
|
last rotation time was missed -- i.e. if the app wasn't running at the
|
||||||
|
|
|
@ -35,9 +35,8 @@ try {
|
||||||
|
|
||||||
//---- globals and constants
|
//---- globals and constants
|
||||||
|
|
||||||
var nodeSpawnSupportsStdio = (
|
var nodeVer = process.versions.node.split('.').map(Number);
|
||||||
Number(process.version.split('.')[0]) >= 0 ||
|
var nodeSpawnSupportsStdio = (nodeVer[0] > 0 || nodeVer[1] >= 8);
|
||||||
Number(process.version.split('.')[1]) >= 8);
|
|
||||||
|
|
||||||
// Internal debug logging via `console.warn`.
|
// Internal debug logging via `console.warn`.
|
||||||
var _DEBUG = false;
|
var _DEBUG = false;
|
||||||
|
@ -1555,7 +1554,6 @@ function main(argv) {
|
||||||
var stylize = (opts.color ? stylizeWithColor : stylizeWithoutColor);
|
var stylize = (opts.color ? stylizeWithColor : stylizeWithoutColor);
|
||||||
|
|
||||||
// Pager.
|
// Pager.
|
||||||
var nodeVer = process.versions.node.split('.').map(Number);
|
|
||||||
var paginate = (
|
var paginate = (
|
||||||
process.stdout.isTTY &&
|
process.stdout.isTTY &&
|
||||||
process.stdin.isTTY &&
|
process.stdin.isTTY &&
|
||||||
|
@ -1655,7 +1653,6 @@ if (require.main === module) {
|
||||||
// We override the `process.stdout.end` guard that core node.js puts in
|
// We override the `process.stdout.end` guard that core node.js puts in
|
||||||
// place. The real fix is that `.end()` shouldn't be called on stdout
|
// place. The real fix is that `.end()` shouldn't be called on stdout
|
||||||
// in node core. Node v0.6.9 fixes that. Only guard for v0.6.0..v0.6.8.
|
// in node core. Node v0.6.9 fixes that. Only guard for v0.6.0..v0.6.8.
|
||||||
var nodeVer = process.versions.node.split('.').map(Number);
|
|
||||||
if ([0, 6, 0] <= nodeVer && nodeVer <= [0, 6, 8]) {
|
if ([0, 6, 0] <= nodeVer && nodeVer <= [0, 6, 8]) {
|
||||||
var stdout = process.stdout;
|
var stdout = process.stdout;
|
||||||
stdout.end = stdout.destroy = stdout.destroySoon = function () {
|
stdout.end = stdout.destroy = stdout.destroySoon = function () {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2012 Trent Mick. All rights reserved.
|
* Copyright 2016 Trent Mick
|
||||||
*
|
*
|
||||||
* If available, test dtrace support.
|
* If available, test dtrace support.
|
||||||
*/
|
*/
|
||||||
|
@ -22,7 +22,7 @@ var test = tap4nodeunit.test;
|
||||||
var dtracePlats = ['sunos', 'darwin', 'freebsd'];
|
var dtracePlats = ['sunos', 'darwin', 'freebsd'];
|
||||||
var runDtraceTests = true;
|
var runDtraceTests = true;
|
||||||
try {
|
try {
|
||||||
require('dtrace-provider')
|
require('dtrace-provider');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log('# skip dtrace tests: no dtrace-provider module');
|
console.log('# skip dtrace tests: no dtrace-provider module');
|
||||||
runDtraceTests = false;
|
runDtraceTests = false;
|
||||||
|
@ -75,4 +75,48 @@ test('basic dtrace', function (t) {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Run a logger that logs a couple records every second.
|
||||||
|
* Then run `bunyan -p PID` to capture.
|
||||||
|
* Let those run for a few seconds to ensure dtrace has time to attach and
|
||||||
|
* capture something.
|
||||||
|
*/
|
||||||
|
test('bunyan -p', function (t) {
|
||||||
|
var p = spawn('node', [__dirname + '/log-some-loop.js']);
|
||||||
|
|
||||||
|
var bunyanP = spawn('node',
|
||||||
|
[__dirname + '/../bin/bunyan', '-p', String(p.pid), '-0']);
|
||||||
|
var traces = [];
|
||||||
|
bunyanP.stdout.on('data', function (data) {
|
||||||
|
//console.error('BUNYAN -P STDOUT:', data.toString());
|
||||||
|
traces.push(data.toString());
|
||||||
|
});
|
||||||
|
bunyanP.stderr.on('data', function (data) {
|
||||||
|
console.error('BUNYAN -P STDERR:', data.toString());
|
||||||
|
});
|
||||||
|
bunyanP.on('exit', function (code) {
|
||||||
|
traces = traces.join('').split('\n')
|
||||||
|
.filter(function (t) { return t.trim().length })
|
||||||
|
.map(function (t) { return JSON.parse(t) });
|
||||||
|
t.ok(traces.length >= 3, 'got >=3 log records: ' + traces.length);
|
||||||
|
if (traces.length >= 3) {
|
||||||
|
if (traces[0].level !== bunyan.DEBUG) {
|
||||||
|
traces.shift();
|
||||||
|
}
|
||||||
|
t.equal(traces[0].level, bunyan.DEBUG);
|
||||||
|
t.equal(traces[0].foo, 'bar');
|
||||||
|
t.equal(traces[1].level, bunyan.TRACE);
|
||||||
|
t.equal(traces[1].msg, 'hi at trace');
|
||||||
|
}
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Give it a few seconds to ensure we get some traces.
|
||||||
|
setTimeout(function () {
|
||||||
|
p.kill();
|
||||||
|
bunyanP.kill();
|
||||||
|
}, 3000);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
} /* end of `if (runDtraceTests)` */
|
} /* end of `if (runDtraceTests)` */
|
||||||
|
|
15
test/log-some-loop.js
Normal file
15
test/log-some-loop.js
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
// A helper script to log a few times, pause, repeat. We attempt to NOT emit
|
||||||
|
// to stdout or stderr because this is used for dtrace testing
|
||||||
|
// and we don't want to mix output.
|
||||||
|
|
||||||
|
var bunyan = require('../lib/bunyan');
|
||||||
|
var log = bunyan.createLogger({
|
||||||
|
name: 'play',
|
||||||
|
serializers: bunyan.stdSerializers
|
||||||
|
});
|
||||||
|
|
||||||
|
setInterval(function logSome() {
|
||||||
|
log.debug({foo: 'bar'}, 'hi at debug')
|
||||||
|
log.trace('hi at trace')
|
||||||
|
}, 1000);
|
Loading…
Reference in a new issue