bunyan-prettystream
Version:
A stream implementation of the bunyan cli tool's pretty printing capabilities
139 lines (119 loc) • 6.35 kB
JavaScript
var blanket = require("blanket")({
"pattern": "/lib/prettystream.js"
});
var PrettyStream = require('..');
var Stream = require('stream');
var should = require("should");
var util = require('util');
function TestStream(test, done){
Stream.call(this);
this.readable = true;
this.writable = true;
this.test = test;
this.done = done;
}
util.inherits(TestStream, Stream);
TestStream.prototype.write = function write(data){
this.test(data);
this.emit('data', data);
return true;
};
TestStream.prototype.end = function end(){
this.emit('end');
if (this.done){
this.done();
}
};
var simpleRecord = {
name:"myservice",
pid:123,
hostname:"example.com",
level:30,
msg:"My message",
time:"2012-02-08T22:56:52.856Z",
v:0};
var extraFieldRecord = {
name: "myservice",
pid: 123,
hostname:"example.com",
level:30,
extra:"field",
msg:"My message",
time:"2012-02-08T22:56:52.856Z",
v:0};
var undefinedFields = {
name: "myservice",
pid: 123,
hostname:"example.com",
level:30,
msg:"My message",
time:"2012-02-08T22:56:52.856Z",
defined: undefined,
v:0};
var simpleReqRecord = {"name":"amon-master","hostname":"9724a190-27b6-4fd8-830b-a574f839c67d","pid":12859,"route":"HeadAgentProbes","req_id":"cce79d15-ffc2-487c-a4e4-e940bdaac31e","level":20,"contentMD5":"11FxOYiYfpMxmANj4kGJzg==","msg":"headAgentProbes respond","time":"2012-08-08T10:25:47.636Z","v":0};
var detailedReqResRecord = {"name":"amon-master","hostname":"9724a190-27b6-4fd8-830b-a574f839c67d","pid":12859,"audit":true,"level":30,"remoteAddress":"10.2.207.2","remotePort":50394,"req_id":"cce79d15-ffc2-487c-a4e4-e940bdaac31e","req":{"method":"HEAD","url":"/agentprobes?agent=ccf92af9-0b24-46b6-ab60-65095fdd3037","headers":{"accept":"application/json","content-type":"application/json","host":"10.2.207.16","connection":"keep-alive"},"httpVersion":"1.1","trailers":{},"version":"*"},"res":{"statusCode":200,"headers":{"content-md5":"11FxOYiYfpMxmANj4kGJzg==","access-control-allow-origin":"*","access-control-allow-headers":"Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version","access-control-allow-methods":"HEAD","access-control-expose-headers":"X-Api-Version, X-Request-Id, X-Response-Time","connection":"Keep-Alive","date":"Wed, 08 Aug 2012 10:25:47 GMT","server":"Amon Master/1.0.0","x-request-id":"cce79d15-ffc2-487c-a4e4-e940bdaac31e","x-response-time":3},"trailer":false},"route":{"name":"HeadAgentProbes","version":false},"latency":3,"secure":false,"_audit":true,"msg":"HeadAgentProbes handled: 200","time":"2012-08-08T10:25:47.637Z","v":0};
describe('A PrettyStream', function(){
it('should pretty print simple uncolored log statments', function(){
var prettyStream = new PrettyStream({useColor: false});
var result = prettyStream.formatRecord(simpleRecord);
result.should.equal('[2012-02-08T22:56:52.856Z] INFO: myservice/123 on example.com: My message\n');
});
it('should pretty print uncolored log statments with extra fields', function(){
var prettyStream = new PrettyStream({useColor: false});
var result = prettyStream.formatRecord(extraFieldRecord);
result.should.equal('[2012-02-08T22:56:52.856Z] INFO: myservice/123 on example.com: My message (extra=field)\n');
});
it('should print undefined fields as empty strings', function(){
var prettyStream = new PrettyStream({useColor: false});
var result = prettyStream.formatRecord(undefinedFields);
result.should.equal('[2012-02-08T22:56:52.856Z] INFO: myservice/123 on example.com: My message (defined="")\n');
});
it('should pretty print colored log statments', function(){
var prettyStream = new PrettyStream({useColor: true});
var result = prettyStream.formatRecord(simpleRecord);
result.should.equal('[\u001b[37m2012-02-08T22:56:52.856Z\u001b[39m] \u001b[36m INFO\u001b[39m: myservice/123 on example.com: \u001b[36mMy message\u001b[39m\n');
});
it('should pretty print simple request log statments', function(){
var prettyStream = new PrettyStream({useColor: false});
var result = prettyStream.formatRecord(simpleReqRecord);
result.should.equal('[2012-08-08T10:25:47.636Z] DEBUG: amon-master/12859 on 9724a190-27b6-4fd8-830b-a574f839c67d: headAgentProbes respond (route=HeadAgentProbes, req_id=cce79d15-ffc2-487c-a4e4-e940bdaac31e, contentMD5=11FxOYiYfpMxmANj4kGJzg==)\n');
});
it('should pretty print detailed request and response log statments', function(){
var prettyStream = new PrettyStream({useColor: false});
var result = prettyStream.formatRecord(detailedReqResRecord);
var expected = [ '[2012-08-08T10:25:47.637Z] INFO: amon-master/12859 on 9724a190-27b6-4fd8-830b-a574f839c67d: HeadAgentProbes handled: 200 (req.version=*, audit=true, remoteAddress=10.2.207.2, remotePort=50394, req_id=cce79d15-ffc2-487c-a4e4-e940bdaac31e, latency=3, secure=false, _audit=true)',
' HEAD /agentprobes?agent=ccf92af9-0b24-46b6-ab60-65095fdd3037 HTTP/1.1',
' accept: application/json',
' content-type: application/json',
' host: 10.2.207.16',
' connection: keep-alive',
' --',
' HTTP/1.1 200 OK',
' content-md5: 11FxOYiYfpMxmANj4kGJzg==',
' access-control-allow-origin: *',
' access-control-allow-headers: Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version',
' access-control-allow-methods: HEAD',
' access-control-expose-headers: X-Api-Version, X-Request-Id, X-Response-Time',
' connection: Keep-Alive',
' date: Wed, 08 Aug 2012 10:25:47 GMT',
' server: Amon Master/1.0.0',
' x-request-id: cce79d15-ffc2-487c-a4e4-e940bdaac31e',
' x-response-time: 3',
' --',
' route: {',
' "name": "HeadAgentProbes",',
' "version": false',
' }'].join('\n') + "\n";
result.should.equal(expected);
});
it('should work as a stream', function(done){
var prettyStream = new PrettyStream({useColor: false});
var test = function(data){
data.should.equal('[2012-02-08T22:56:52.856Z] INFO: myservice/123 on example.com: My message\n');
};
prettyStream.pipe(new TestStream(test, done));
prettyStream.write(simpleRecord);
prettyStream.end();
});
});
;