Comparing version 0.21.0 to 0.22.0
@@ -29,4 +29,9 @@ var split = require('split'); | ||
function end() { req.body.push(null); } | ||
req.pipe(split()).pipe(through(parseLine, end)); | ||
function trimNewline(line) { | ||
return line.replace(/\r?\n/, ''); | ||
} | ||
req.pipe(split(/\b\r?\n\b/, trimNewline, null)).pipe(through(parseLine, end)); | ||
return next(); | ||
@@ -33,0 +38,0 @@ } |
@@ -1,2 +0,2 @@ | ||
logfmt = require('../logfmt'); | ||
var _ = require('lodash'); | ||
@@ -6,5 +6,7 @@ exports.log = function(data, stream) { | ||
var line = ''; | ||
Object.keys(data).forEach(function(key){ | ||
var value = data[key]; | ||
var line = ''; | ||
var logData = _.extend({}, this.defaultData, data); | ||
Object.keys(logData).forEach(function(key){ | ||
var value = logData[key]; | ||
var is_null = false; | ||
@@ -17,3 +19,3 @@ if(value == null) { | ||
var needs_quoting = value.indexOf(' ') > -1 || value.indexOf('=') > -1; | ||
var needs_quoting = value.indexOf(' ') > -1 || value.indexOf('=') > -1; | ||
var needs_escaping = value.indexOf('"') > -1; | ||
@@ -40,8 +42,12 @@ | ||
if(!arg2){ | ||
label = 'elapsed'; | ||
callback = arg1; | ||
if(typeof arg1 === 'function'){ | ||
label = 'elapsed'; | ||
callback = arg1; | ||
} | ||
} | ||
else if(!arg3){ | ||
if(arg1.substring){ | ||
//using method detection | ||
if(typeof arg1 === 'string'){ | ||
label = arg1; | ||
top_data = {}; | ||
}else{ | ||
@@ -54,28 +60,12 @@ label = 'elapsed'; | ||
var logger = {}; | ||
var self = this; | ||
var logger = this.namespace(top_data); | ||
var orig_log = logger.log; | ||
logger.log = function(data, stream){ | ||
var now = (new Date()).getTime() | ||
if(!data) data = {}; | ||
for (key in top_data) { | ||
data[key] = top_data[key]; | ||
} | ||
data = data || {}; | ||
data[label] = (now - startTime).toString() + 'ms' ; | ||
var stream = stream || self.stream | ||
self.log(data, stream); | ||
orig_log.call(this, data, stream) | ||
} | ||
logger.error = function(err, stream){ | ||
var now = (new Date()).getTime() | ||
var id = Math.random().toString().slice(2, 12); | ||
data = { error:true, id:id }; | ||
for (key in top_data) { | ||
data[key] = top_data[key]; | ||
} | ||
data[label] = (now - startTime).toString() + 'ms'; | ||
var stream = stream || self.stream; | ||
self.log(data, stream); | ||
self.error(err, id); | ||
} | ||
if (typeof callback === 'function') { | ||
@@ -88,19 +78,6 @@ callback(logger); | ||
exports.namespace = function(object){ | ||
var new_logfmt = new logfmt; | ||
var old_log = this.log; | ||
var old_stream = this.stream; | ||
new_logfmt.log = function(data, stream){ | ||
if(stream == undefined) stream = old_stream; | ||
data = data || {}; | ||
logdata = {}; | ||
for (key in object) { | ||
logdata[key] = object[key]; | ||
} | ||
for (key in data) { | ||
logdata[key] = data[key]; | ||
} | ||
old_log(logdata, stream); | ||
} | ||
return new_logfmt; | ||
exports.namespace = function(object) { | ||
var logfmt = require('../logfmt'); | ||
var namespace = _.extend({}, this.defaultData, object); | ||
return new logfmt(this.stream, namespace); | ||
} | ||
@@ -107,0 +84,0 @@ |
@@ -8,3 +8,3 @@ var commonFormatter = function(req, res){ | ||
//in express it is an attribute | ||
var path = req.path || req.url; | ||
var path = req.originalUrl || req.path || req.url; | ||
} | ||
@@ -11,0 +11,0 @@ |
@@ -1,40 +0,39 @@ | ||
var logfmt = function(stream){ | ||
var parse = require('./lib/logfmt_parser').parse; | ||
var _ = require('lodash'); | ||
var bodyParser = require('./lib/body_parser'); | ||
var bodyParserStream = require('./lib/body_parser_stream'); | ||
var logfmtParser = require('./lib/logfmt_parser'); | ||
var logger = require('./lib/logger'); | ||
var requestLogger = require('./lib/request_logger'); | ||
this.parse = parse; | ||
function logfmt(stream, defaultData) { | ||
this.defaultData = defaultData || {}; | ||
this.maxErrorLines = 10; | ||
this.stream = stream || process.stdout; | ||
} | ||
var logger = require('./lib/logger'); | ||
this.log = logger.log; | ||
this.time = logger.time; | ||
this.namespace = logger.namespace; | ||
this.error = logger.error; | ||
_.extend(logfmt.prototype, logger); | ||
this.maxErrorLines = 10; | ||
logfmt.prototype.parse = logfmtParser.parse; | ||
//Syncronous Body Parser | ||
var bodyParser = require('./lib/body_parser') | ||
this.bodyParser = function(options) { | ||
if(options == null) options = {}; | ||
var mime = options.contentType || "application/logplex-1" | ||
return bodyParser({contentType: mime, parser: parse}) | ||
} | ||
// Synchronous body parser | ||
logfmt.prototype.bodyParser = function(options) { | ||
options || (options = {}); | ||
var mime = options.contentType || "application/logplex-1"; | ||
return bodyParser({ contentType: mime, parser: this.parse }); | ||
}; | ||
//Stream Body Parser | ||
var bodyParserStream = require('./lib/body_parser_stream'); | ||
this.bodyParserStream = function(options) { | ||
if(options == null) options = {}; | ||
var mime = options.contentType || "application/logplex-1" | ||
return bodyParserStream({contentType: mime, parser: parse}) | ||
} | ||
// Stream parser | ||
logfmt.prototype.bodyParserStream = function(options) { | ||
options || (options = {}); | ||
var mime = options.contentType || "application/logplex-1"; | ||
return bodyParserStream({ contentType: mime, parser: this.parse }); | ||
}; | ||
//Request Logger | ||
var requestLogger = require('./lib/request_logger'); | ||
this.requestLogger = function(options, formatter){ | ||
return requestLogger.init(this, options, formatter); | ||
} | ||
this.requestLogger.commonFormatter = requestLogger.commonFormatter | ||
} | ||
logfmt.prototype.requestLogger = function(options, formatter) { | ||
return requestLogger.init(this, options, formatter); | ||
}; | ||
exports = module.exports = logfmt; | ||
logfmt.call(exports) | ||
logfmt.prototype.requestLogger.commonFormatter = requestLogger.commonFormatter; | ||
_.extend(logfmt, logfmt.prototype); | ||
module.exports = logfmt; |
{ | ||
"name": "logfmt", | ||
"version": "0.21.0", | ||
"version": "0.22.0", | ||
"description": "key=value logger and parser", | ||
@@ -14,3 +14,4 @@ "main": "logfmt.js", | ||
"split": "0.2.x", | ||
"through": "2.3.x" | ||
"through": "2.3.x", | ||
"lodash": "~2.4.1" | ||
}, | ||
@@ -17,0 +18,0 @@ "devDependencies": { |
@@ -83,6 +83,4 @@ # node-logfmt | ||
### `logfmt.time([label], [data], [callback(logger)])` | ||
### `logfmt.time([label], [data], [callback(logfmt)])` | ||
#### `logger.log([data], [stream])` | ||
Log how long something takes. | ||
@@ -92,4 +90,11 @@ | ||
- `data`: optional extra data to include with every call to `logger.log` | ||
- `logger`: object passed to callback with a `log` function | ||
- `callback(logfmt)`: new logfmt object passed to callback | ||
If you don't pass in callback you get the logger returned. | ||
```javascript | ||
var logfmt2 = logfmt.time(); | ||
logfmt2.log(); | ||
//=> elapsed=1ms | ||
``` | ||
No args defaults to `elapsed=<milliseconds>ms` | ||
@@ -104,9 +109,2 @@ | ||
If you don't pass in callback you get the logger returned. | ||
```javascript | ||
var logger = logfmt.time(); | ||
logger.log(); | ||
//=> elapsed=1ms | ||
``` | ||
String `label` changes the key to `<string>=<milliseconds>ms` | ||
@@ -186,3 +184,3 @@ | ||
```javascript | ||
var logfmt = require('logfmmt'); | ||
var logfmt = require('logfmt'); | ||
logfmt.error(new Error('test error')); | ||
@@ -189,0 +187,0 @@ //=> at=error id=12345 message="test error" |
@@ -47,2 +47,4 @@ var logfmt = require('../logfmt'), | ||
var mockReq = new stream.Readable; | ||
var data; | ||
mockReq.header = function(){ | ||
@@ -60,6 +62,12 @@ return 'application/logplex-1'; | ||
mockReq.body.on('readable', function(){ | ||
var data = mockReq.body.read(); | ||
assert.deepEqual(data, {hello: 'kitty'}) | ||
var chunk = mockReq.body.read(); | ||
if (chunk !== null) { | ||
data = chunk; | ||
} | ||
}) | ||
mockReq.body.on('end', function() { | ||
assert.deepEqual(data, { hello: 'kitty' }); | ||
done(); | ||
}) | ||
}); | ||
}) | ||
@@ -70,2 +78,3 @@ | ||
var mockReq = new stream.Readable; | ||
var data; | ||
mockReq.header = function(){ | ||
@@ -83,6 +92,12 @@ return 'foo'; | ||
mockReq.body.on('readable', function(){ | ||
var data = mockReq.body.read(); | ||
assert.deepEqual(data, {hello: 'kitty'}) | ||
var chunk = mockReq.body.read(); | ||
if (chunk !== null) { | ||
data = chunk; | ||
} | ||
}) | ||
mockReq.body.on('end', function() { | ||
assert.deepEqual(data, { hello: 'kitty' }) | ||
done(); | ||
}) | ||
}); | ||
}) | ||
@@ -89,0 +104,0 @@ |
@@ -1,2 +0,2 @@ | ||
var logfmt = new require('../logfmt'), | ||
var logfmt = require('../logfmt'), | ||
assert = require('assert'); | ||
@@ -29,2 +29,9 @@ | ||
test("logs the time with your label if no callback is provided", function(){ | ||
var logger = logfmt.time('time') | ||
logger.log(); | ||
var actual = logfmt.stream.logline; | ||
assert(/^time=\dms\n$/.test(actual), actual) | ||
}) | ||
test("logs the time with your label and persistent data", function(done){ | ||
@@ -46,3 +53,3 @@ logfmt.time('time', {foo: 'bar'}, function(logger){ | ||
var actual = logfmt.stream.logline; | ||
assert(/^moar=data foo=bar elapsed=\d+ms\n$/.test(actual), actual) | ||
assert(/^foo=bar moar=data elapsed=\d+ms\n$/.test(actual), actual) | ||
done(); | ||
@@ -99,3 +106,3 @@ }) | ||
test("returns a logger", function(){ | ||
test("returns a logfmt", function(){ | ||
var logger1, logger2; | ||
@@ -108,2 +115,11 @@ logger1 = logfmt.time(function(logger){ | ||
test('logger is a proper logfmt object', function(){ | ||
var logger1 = logfmt.time({foo: 'bar'}); | ||
var logfmt2 = new logfmt(); | ||
for(var prop in logfmt2){ | ||
assert(logger1[prop]); | ||
} | ||
}) | ||
// tests you can pass the logger into a closure | ||
@@ -110,0 +126,0 @@ // and call `log` multiple times. |
@@ -39,3 +39,3 @@ var logfmt = require('../logfmt'), | ||
var logfmt2 = logfmt.namespace({ns: 'logfmt'}) | ||
.namespace({thing: 'data'}) | ||
.namespace({thing: 'data'}); | ||
@@ -42,0 +42,0 @@ logfmt2.time(function(logger){ |
@@ -1,2 +0,2 @@ | ||
var logfmt = require('../logfmt'), | ||
var logfmt = new require('../logfmt'), | ||
assert = require('assert'); | ||
@@ -40,3 +40,3 @@ | ||
var actual = logfmt2.stream.logline; | ||
assert(/^ns=logfmt moar=data foo=bar elapsed=\dms\n$/.test(actual), | ||
assert(/^ns=logfmt foo=bar moar=data elapsed=\dms\n$/.test(actual), | ||
actual) | ||
@@ -43,0 +43,0 @@ done(); |
@@ -26,3 +26,3 @@ var logfmt = require('../logfmt'), | ||
test('constructor accepts a stream', function(){ | ||
stream = new OutStream; | ||
var stream = new OutStream; | ||
var logfmt2 = new logfmt(stream); | ||
@@ -29,0 +29,0 @@ var data = {foo: 'bar', a: 14} |
@@ -152,2 +152,13 @@ var logfmt = require('../logfmt'), | ||
test("commonFormatter uses correct path with express", function(){ | ||
var mockReq = {method: 'GET'} | ||
mockReq.originalUrl = '/bar' | ||
mockReq.ip = '1.0.0.1' | ||
mockReq.header = function(h){ return 'foo' } | ||
var mockRes = {statusCode: 200} | ||
mockRes.get = function(){ return 'foo' } | ||
var actual = logfmt.requestLogger.commonFormatter(mockReq, mockRes); | ||
assert.equal('/bar', actual.path); | ||
}) | ||
test("commonFormatter uses correct path", function(){ | ||
@@ -154,0 +165,0 @@ var mockReq = {method: 'GET'} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
57202
1347
3
373
+ Addedlodash@~2.4.1
+ Addedlodash@2.4.2(transitive)