diff --git a/bin/bunyan b/bin/bunyan index 3d31ab0..826063b 100755 --- a/bin/bunyan +++ b/bin/bunyan @@ -698,7 +698,12 @@ function processStdin(opts, stylize, callback) { * @param callback {Function} `function ()` */ function processFile(file, opts, stylize, callback) { - var stream = fs.createReadStream(file, {encoding: 'utf8'}); + var stream = fs.createReadStream(file); + if (/\.gz$/.test(file)) { + stream = stream.pipe(require('zlib').createGunzip()); + } + // Manually decode streams - lazy load here as per node/lib/fs.js + var decoder = new (require('string_decoder').StringDecoder)('utf8'); streams[file].stream = stream; @@ -708,7 +713,11 @@ function processFile(file, opts, stylize, callback) { }); var leftover = ''; // Left-over partial line from last chunk. - stream.on('data', function (chunk) { + stream.on('data', function (data) { + var chunk = decoder.write(data); + if (!chunk.length) { + return; + } var lines = chunk.split(/\r\n|\n/); var length = lines.length; if (length === 1) { diff --git a/test/cli.test.js b/test/cli.test.js index 9ba871b..1f29db9 100644 --- a/test/cli.test.js +++ b/test/cli.test.js @@ -168,3 +168,35 @@ test('multiple logs', function (t) { t.end(); }); }); + +test('log1.log.gz', function (t) { + exec(BUNYAN + ' corpus/log1.log.gz', function (err, stdout, stderr) { + t.error(err); + t.equal(stdout, [ + '[2012-05-08T16:57:55.586Z] INFO: agent1/73267 on headnode: message\n', + '[2012-05-08T17:02:49.339Z] INFO: agent1/73267 on headnode: message\n', + '[2012-05-08T17:02:49.404Z] INFO: agent1/73267 on headnode: message\n', + '[2012-05-08T17:02:49.404Z] INFO: agent1/73267 on headnode: message\n', + ].join('')); + t.end(); + }); +}); + +test('mixed text and gzip logs', function (t) { + exec(BUNYAN + ' corpus/log1.log.gz corpus/log2.log', + function (err, stdout, stderr) { + t.error(err); + t.equal(stdout, [ + '[2012-05-08T16:57:55.586Z] INFO: agent1/73267 on headnode: message\n', + '[2012-05-08T16:58:55.586Z] INFO: agent2/73267 on headnode: message\n', + '[2012-05-08T17:01:49.339Z] INFO: agent2/73267 on headnode: message\n', + '[2012-05-08T17:02:47.404Z] INFO: agent2/73267 on headnode: message\n', + '[2012-05-08T17:02:49.339Z] INFO: agent1/73267 on headnode: message\n', + '[2012-05-08T17:02:49.404Z] INFO: agent1/73267 on headnode: message\n', + '[2012-05-08T17:02:49.404Z] INFO: agent1/73267 on headnode: message\n', + '[2012-05-08T17:02:57.404Z] INFO: agent2/73267 on headnode: message\n', + '[2012-05-08T17:08:01.105Z] INFO: agent2/76156 on headnode: message\n', + ].join('')); + t.end(); + }); +}); diff --git a/test/corpus/log1.log.gz b/test/corpus/log1.log.gz new file mode 100644 index 0000000..43068dc Binary files /dev/null and b/test/corpus/log1.log.gz differ