Add an example showing how to use raw streams for #130

master
Trent Mick 2014-05-31 21:58:10 -07:00
parent af6afa3c31
commit 118d73e588
1 changed files with 77 additions and 0 deletions

View File

@ -0,0 +1,77 @@
#!/usr/bin/env node
/**
* <https://github.com/trentm/node-bunyan/issues/130> was a request to have
* bunyan core support logging some levels to one stream and others to another,
* *not* limited by bunyan's current support that a stream `level` implies
* "that level and higher".
*
* Let's do that with a custom raw stream.
*/
var bunyan = require('../lib/bunyan'),
safeCycles = bunyan.safeCycles;
var fs = require('fs');
/**
* Use case #1: cli tool that outputs errors on stderr and everything else on
* stdout.
*
* First make a raw bunyan stream (i.e. an object with a `.write(rec)`).
*/
function SpecificLevelStream(levels, stream) {
var self = this;
this.levels = {};
levels.forEach(function (lvl) {
self.levels[bunyan.resolveLevel(lvl)] = true;
});
this.stream = stream;
}
SpecificLevelStream.prototype.write = function (rec) {
if (this.levels[rec.level] !== undefined) {
var str = JSON.stringify(rec, safeCycles()) + '\n';
this.stream.write(str);
}
}
var log1 = bunyan.createLogger({
name: 'use-case-1',
streams: [{
level: 'trace',
type: 'raw',
stream: new SpecificLevelStream(
['trace', 'debug', 'info', 'warn'],
process.stdout)
},{
level: 'error',
type: 'raw',
stream: new SpecificLevelStream(
['error'],
process.stderr)
}]
});
log1.info('hi at info level (this should be on stdout)');
log1.error('alert alert (this should be on stderr)');
/**
* Use case #2: nginx-style logger that separates error- and access-logs
*/
var log2 = bunyan.createLogger({
name: 'use-case-2',
streams: [{
level: 'info',
type: 'raw',
stream: new SpecificLevelStream(
['info'],
fs.createWriteStream('specific-level-stream-http.log',
{flags: 'a', encoding: 'utf8'}))
},{
level: 'warn',
path: 'specific-level-stream-http.err.log'
}
]
});
log2.info('200 GET /blah');
log2.error('500 GET /boom');