Comparing version 0.23.0 to 1.0.0-pre
@@ -9,2 +9,7 @@ var _ = require('lodash'); | ||
if(this.timerNow){ | ||
var now = (new Date()).getTime() | ||
logData[this.timerKey] = (now - this.timerNow).toString() + 'ms' ; | ||
} | ||
Object.keys(logData).forEach(function(key){ | ||
@@ -33,42 +38,9 @@ var value = logData[key]; | ||
exports.time = function(arg1, arg2, arg3) { | ||
exports.time = function(label) { | ||
var logfmt = require('../logfmt'); | ||
var startTime = (new Date()).getTime(); | ||
var label = arg1; | ||
var top_data = arg2 || {}; | ||
var callback = arg3; | ||
if(!arg2){ | ||
if(typeof arg1 === 'function'){ | ||
label = 'elapsed'; | ||
callback = arg1; | ||
} | ||
} | ||
else if(!arg3){ | ||
//using method detection | ||
if(typeof arg1 === 'string'){ | ||
label = arg1; | ||
top_data = {}; | ||
}else{ | ||
label = 'elapsed'; | ||
top_data = arg1; | ||
} | ||
callback = arg2; | ||
} | ||
var logger = this.namespace(top_data); | ||
var orig_log = logger.log; | ||
logger.log = function(data, stream){ | ||
var now = (new Date()).getTime() | ||
data = data || {}; | ||
data[label] = (now - startTime).toString() + 'ms' ; | ||
orig_log.call(this, data, stream) | ||
} | ||
if (typeof callback === 'function') { | ||
callback(logger); | ||
} | ||
return logger; | ||
var label = label || 'elapsed'; | ||
var timer = new logfmt(this.stream, this.defaultData, | ||
{key: label, now: startTime}); | ||
return timer; | ||
} | ||
@@ -78,4 +50,6 @@ | ||
var logfmt = require('../logfmt'); | ||
var namespace = _.extend({}, this.defaultData, object); | ||
return new logfmt(this.stream, namespace); | ||
var namespace = _.extend({}, this.defaultData, object); | ||
var namespaced = new logfmt(this.stream, namespace, | ||
{key: this.timerKey, now: this.timerNow}); | ||
return namespaced; | ||
} | ||
@@ -82,0 +56,0 @@ |
@@ -47,12 +47,11 @@ var commonFormatter = function(req, res){ | ||
var elapsed = options.elapsed || 'elapsed'; | ||
logger.time(elapsed, function(logger) { | ||
var end = res.end; | ||
res.end = function(chunk, encoding) { | ||
var data = formatter(req, res); | ||
res.end = end; | ||
res.end(chunk, encoding); | ||
logger.log(data); | ||
}; | ||
next(); | ||
}) | ||
var timer = logger.time(elapsed); | ||
var end = res.end; | ||
res.end = function(chunk, encoding) { | ||
var data = formatter(req, res); | ||
res.end = end; | ||
res.end(chunk, encoding); | ||
timer.log(data); | ||
}; | ||
next(); | ||
} | ||
@@ -59,0 +58,0 @@ } |
@@ -8,6 +8,10 @@ var _ = require('lodash'); | ||
function logfmt(stream, defaultData) { | ||
function logfmt(stream, defaultData, timer) { | ||
this.stream = stream || process.stdout; | ||
this.defaultData = defaultData || {}; | ||
if(timer){ | ||
this.timerKey = timer.key; | ||
this.timerNow = timer.now; | ||
} | ||
this.maxErrorLines = 10; | ||
this.stream = stream || process.stdout; | ||
} | ||
@@ -14,0 +18,0 @@ |
{ | ||
"name": "logfmt", | ||
"version": "0.23.0", | ||
"version": "1.0.0-pre", | ||
"description": "key=value logger and parser", | ||
@@ -5,0 +5,0 @@ "main": "logfmt.js", |
@@ -94,78 +94,35 @@ # node-logfmt | ||
### `logfmt.time([label], [data], [callback(logfmt)])` | ||
### `logfmt.time([label])` | ||
Log how long something takes. | ||
Returns a new `logfmt` with elapsed milliseconds included in every `log` call. | ||
- `label`: optional name for the milliseconds key (defaults to `elapsed`) | ||
- `data`: optional extra data to include with every call to `logger.log` | ||
- `callback(logfmt)`: new logfmt object passed to callback | ||
- `label`: optional name for the milliseconds key. defaults to: `elapsed=<milliseconds>ms` | ||
If you don't pass in callback you get the logger returned. | ||
```javascript | ||
var logfmt2 = logfmt.time(); | ||
logfmt2.log(); | ||
var timer = logfmt.time(); | ||
timer.log(); | ||
//=> elapsed=1ms | ||
``` | ||
No args defaults to `elapsed=<milliseconds>ms` | ||
```javascript | ||
logfmt.time(function(logger){ | ||
logger.log(); | ||
}) | ||
//=> elapsed=1ms | ||
``` | ||
String `label` changes the key to `<string>=<milliseconds>ms` | ||
```javascript | ||
logfmt.time('time', function(logger){ | ||
logger.log(); | ||
logger.log(); | ||
}) | ||
var timer = logfmt.time('time'); | ||
timer.log(); | ||
//=> time=1ms | ||
timer.log(); | ||
//=> time=2ms | ||
``` | ||
Data can be passed to `logger.log` | ||
If you'd like to include data, just chain a call to namespace. | ||
```javascript | ||
logfmt.time(function(logger){ | ||
logger.log({foo: 'bar'}); | ||
}) | ||
//=> foo=bar elapsed=1ms | ||
var timer = logfmt.time('time').namespace({foo: 'bar'}); | ||
timer.log(); | ||
//=> time=1ms foo=bar | ||
timer.log(); | ||
//=> time=2ms foo=bar | ||
``` | ||
Data can also be passed to `logfmt.time` and will persist | ||
across calls to `logger.log` | ||
```javascript | ||
logfmt.time('thing', {foo: 'bar'}, function(logger){ | ||
logger.log({at: 'function.start'}); | ||
logger.log({at: 'function.end'}); | ||
}) | ||
//=> at=function.start foo=bar thing=1ms | ||
//=> at=function.end foo=bar thing=2ms | ||
``` | ||
You do not need a `label` to pass data to `logfmt.time` | ||
```javascript | ||
logfmt.time({foo: 'bar'}, function(logger){ | ||
logger.log({at: 'function'}); | ||
}) | ||
//=> at=function foo=bar elapsed=1ms | ||
``` | ||
`time` works with `namespace` as expected | ||
```javascript | ||
var logfmt = require('logfmt').namespace({app: 'logfmt'}) | ||
logfmt.time({foo: 'bar'}, function(logger){ | ||
logger.log({at: 'function'}); | ||
}) | ||
//=> app=logfmt at=function foo=bar elapsed=1ms | ||
``` | ||
### customizing logging location | ||
@@ -172,0 +129,0 @@ |
@@ -5,2 +5,5 @@ var logfmt = require('../logfmt'), | ||
//avoid test bleeding | ||
var logfmt = new logfmt; | ||
suite('logfmt.bodyParserStream', function() { | ||
@@ -7,0 +10,0 @@ |
var logfmt = require('../logfmt'), | ||
assert = require('assert'); | ||
var logfmt = new logfmt; | ||
var OutStream = require('./outstream'); | ||
@@ -5,0 +6,0 @@ |
var logfmt = require('../logfmt'), | ||
assert = require('assert'); | ||
var logfmt = new logfmt(); | ||
var OutStream = require('./outstream'); | ||
@@ -11,22 +12,11 @@ | ||
test("logs the time", function(done){ | ||
logfmt.time(function(logger){ | ||
logger.log(); | ||
var actual = logfmt.stream.logline; | ||
assert(/^elapsed=\dms\n$/.test(actual), actual) | ||
done(); | ||
}) | ||
test("logs the time as elapsed", function(){ | ||
var logger = logfmt.time(); | ||
logger.log(); | ||
var actual = logfmt.stream.logline; | ||
assert(/^elapsed=\dms\n$/.test(actual), actual) | ||
}) | ||
test("logs the time with your label", function(done){ | ||
logfmt.time('time', function(logger){ | ||
logger.log(); | ||
var actual = logfmt.stream.logline; | ||
assert(/^time=\dms\n$/.test(actual), actual) | ||
done(); | ||
}) | ||
}) | ||
test("logs the time with your label if no callback is provided", function(){ | ||
var logger = logfmt.time('time') | ||
test("logs the time with your label", function(){ | ||
var logger = logfmt.time('time'); | ||
logger.log(); | ||
@@ -37,21 +27,14 @@ var actual = logfmt.stream.logline; | ||
test("logs the time with your label and persistent data", function(done){ | ||
logfmt.time('time', {foo: 'bar'}, function(logger){ | ||
logger.log(); | ||
var actual = logfmt.stream.logline; | ||
assert(/^foo=bar time=\dms\n$/.test(actual), actual) | ||
done(); | ||
}) | ||
test("logs the time with your data", function(){ | ||
var logger = logfmt.time('time1').namespace({foo: 'bar'}); | ||
logger.log({foo: 'bar'}); | ||
var actual = logfmt.stream.logline; | ||
assert(/^foo=bar time1=\d+ms\n$/.test(actual), actual) | ||
}) | ||
test("logs the time with persistent data", function(done){ | ||
logfmt.time({foo: 'bar'}, function(logger){ | ||
logger.log(); | ||
var actual = logfmt.stream.logline; | ||
assert(/^foo=bar elapsed=\d+ms\n$/.test(actual), actual) | ||
logger.log({moar: 'data'}); | ||
var actual = logfmt.stream.logline; | ||
assert(/^foo=bar moar=data elapsed=\d+ms\n$/.test(actual), actual) | ||
done(); | ||
}) | ||
test("logs the time with your label and your data", function(){ | ||
var logger = logfmt.time('time').namespace({foo: 'bar'}) | ||
logger.log(); | ||
var actual = logfmt.stream.logline; | ||
assert(/^foo=bar time=\dms\n$/.test(actual), actual) | ||
}) | ||
@@ -62,59 +45,24 @@ | ||
test("accurancy in milliseconds", function(done){ | ||
logfmt.time(function(logger){ | ||
var wrapped = function() { | ||
logger.log(); | ||
var actual = logfmt.stream.logline; | ||
assert(/^elapsed=2\dms\n$/.test(actual), actual) | ||
done(); | ||
} | ||
setTimeout(wrapped, 20); | ||
}) | ||
}) | ||
test("logs the time with your label and data", function(done){ | ||
logfmt.time('time', function(logger){ | ||
logger.log({foo: 'bar'}); | ||
var logger = logfmt.time(); | ||
var wrapped = function() { | ||
logger.log(); | ||
var actual = logfmt.stream.logline; | ||
assert(/^foo=bar time=\d+ms\n$/.test(actual), actual) | ||
assert(/^elapsed=2\dms\n$/.test(actual), actual) | ||
done(); | ||
}) | ||
} | ||
setTimeout(wrapped, 20); | ||
}) | ||
test("supports log(data, stream) interface", function(done){ | ||
test("supports log(data, stream) interface", function(){ | ||
var mock_sink = new OutStream; | ||
logfmt.time(function(logger){ | ||
logger.log({foo: 'bar'}, mock_sink); | ||
var actual = mock_sink.logline; | ||
assert(/^foo=bar elapsed=\d+ms\n$/.test(actual), actual) | ||
done(); | ||
}) | ||
var logger = logfmt.time() | ||
logger.log({foo: 'bar'}, mock_sink); | ||
var actual = mock_sink.logline; | ||
assert(/^foo=bar elapsed=\d+ms\n$/.test(actual), actual) | ||
}) | ||
test("calls the callback if provided", function(){ | ||
var test; | ||
logfmt.time(function(logger){ | ||
test = true; | ||
}); | ||
assert(test); | ||
}) | ||
test('returns a logfmt', function(){ | ||
var logger1 = logfmt.time(); | ||
test("does not call the callback if not provided", function(){ | ||
assert.doesNotThrow(function(){ | ||
logfmt.time(); | ||
}); | ||
}) | ||
test("returns a logfmt", function(){ | ||
var logger1, logger2; | ||
logger1 = logfmt.time(function(logger){ | ||
logger2 = logger; | ||
}); | ||
assert.equal(logger1, logger2); | ||
}) | ||
test('logger is a proper logfmt object', function(){ | ||
var logger1 = logfmt.time({foo: 'bar'}); | ||
var logfmt2 = new logfmt(); | ||
for(var prop in logfmt2){ | ||
for(var prop in logfmt){ | ||
assert(logger1[prop]); | ||
@@ -129,15 +77,14 @@ } | ||
var mock_sink = new OutStream; | ||
logfmt.time(function(logger){ | ||
logger.log({foo: 'bar'}, mock_sink); | ||
var logger = logfmt.time() | ||
logger.log({foo: 'bar'}, mock_sink); | ||
var actual = mock_sink.logline; | ||
assert(/^foo=bar elapsed=\d+ms\n$/.test(actual), actual) | ||
var wrapped = function() { | ||
logger.log({bar: 'foo'}, mock_sink); | ||
var actual = mock_sink.logline; | ||
assert(/^foo=bar elapsed=\d+ms\n$/.test(actual), actual) | ||
var wrapped = function() { | ||
logger.log({bar: 'foo'}, mock_sink); | ||
var actual = mock_sink.logline; | ||
assert(/^bar=foo elapsed=2\d+ms\n$/.test(actual), actual) | ||
done(); | ||
} | ||
setTimeout(wrapped, 20); | ||
}) | ||
assert(/^bar=foo elapsed=2\d+ms\n$/.test(actual), actual) | ||
done(); | ||
} | ||
setTimeout(wrapped, 20); | ||
}) | ||
}) |
@@ -7,10 +7,9 @@ var logfmt = require('../logfmt'), | ||
suite('logfmt.namespace', function() { | ||
test("returns a new logfmt object", function(){ | ||
var logfmt2 = logfmt.namespace(); | ||
var mock_sink = new OutStream; | ||
var data = {foo: 'bar', a: 14} | ||
logfmt2.log(data, mock_sink); | ||
assert.equal("foo=bar a=14\n", mock_sink.logline) | ||
var recovered = logfmt2.parse(mock_sink.logline) | ||
assert.deepEqual(data, recovered); | ||
test('returns a logfmt', function(){ | ||
var logger1 = logfmt.namespace(); | ||
var logfmt2 = new logfmt(); | ||
for(var prop in logfmt2){ | ||
assert(logger1[prop]); | ||
} | ||
}) | ||
@@ -38,27 +37,12 @@ | ||
test("can chain namespace calls", function(done){ | ||
test("can chain namespace calls", function(){ | ||
var logfmt2 = logfmt.namespace({ns: 'logfmt'}) | ||
.namespace({thing: 'data'}); | ||
logfmt2.time(function(logger){ | ||
var mock_sink = new OutStream; | ||
logger.log({}, mock_sink); | ||
var actual = mock_sink.logline; | ||
assert(/^ns=logfmt thing=data elapsed=\dms\n$/.test(actual), actual) | ||
done(); | ||
}) | ||
}) | ||
test("works when a stream is not passed in", function(){ | ||
var logfmt2 = logfmt.namespace(); | ||
var logger = logfmt2.time(); | ||
var mock_sink = new OutStream; | ||
var data = ''; | ||
try { | ||
logfmt2.log({"foo":"bar"}); | ||
data = 'success'; | ||
} catch (err) { | ||
data = 'failure'; | ||
} | ||
assert.equal('success', data); | ||
logger.log({}, mock_sink); | ||
var actual = mock_sink.logline; | ||
assert(/^ns=logfmt thing=data elapsed=\dms\n$/.test(actual), actual) | ||
}) | ||
}) |
@@ -1,2 +0,2 @@ | ||
var logfmt = new require('../logfmt'), | ||
var logfmt = require('../logfmt'), | ||
assert = require('assert'); | ||
@@ -7,40 +7,33 @@ | ||
suite('logfmt.namespace.time', function() { | ||
test("works with explicit logging location", function(done){ | ||
test("works with explicit logging location", function(){ | ||
var logfmt2 = logfmt.namespace({ns: 'logfmt'}) | ||
logfmt2.time(function(logger){ | ||
var mock_sink = new OutStream; | ||
logger.log({}, mock_sink); | ||
var actual = mock_sink.logline; | ||
assert(/^ns=logfmt elapsed=\dms\n$/.test(actual), actual) | ||
done(); | ||
}) | ||
var logger = logfmt2.time(); | ||
var mock_sink = new OutStream; | ||
logger.log({}, mock_sink); | ||
var actual = mock_sink.logline; | ||
assert(/^ns=logfmt elapsed=\dms\n$/.test(actual), actual) | ||
}) | ||
test("works with logfmt.time and implicit log location", function(done){ | ||
test("works with logfmt.time and implicit log location", function(){ | ||
var logfmt2 = logfmt.namespace({ns: 'logfmt'}) | ||
logfmt2.stream = new OutStream; | ||
logfmt2.time('time', function(logger){ | ||
logger.log({foo: 'bar'}); | ||
var actual = logfmt2.stream.logline; | ||
assert(/^ns=logfmt foo=bar time=\dms\n$/.test(actual), actual) | ||
done(); | ||
}) | ||
var timer = logfmt2.time('time'); | ||
timer.log({foo: 'bar'}); | ||
var actual = logfmt2.stream.logline; | ||
assert(/^ns=logfmt foo=bar time=\dms\n$/.test(actual), actual) | ||
}) | ||
test("works with persistent data", function(done){ | ||
test("works with persistent data", function(){ | ||
var logfmt2 = logfmt.namespace({ns: 'logfmt'}) | ||
logfmt2.stream = new OutStream; | ||
logfmt2.time({foo: 'bar'}, function(logger){ | ||
logger.log(); | ||
var actual = logfmt2.stream.logline; | ||
assert(/^ns=logfmt foo=bar elapsed=\dms\n$/.test(actual), actual) | ||
logger.log({moar: 'data'}); | ||
var actual = logfmt2.stream.logline; | ||
assert(/^ns=logfmt foo=bar moar=data elapsed=\dms\n$/.test(actual), | ||
actual) | ||
done(); | ||
}) | ||
var logger = logfmt2.time().namespace({foo: 'bar'}); | ||
logger.log(); | ||
var actual = logfmt2.stream.logline; | ||
assert(/^ns=logfmt foo=bar elapsed=\dms\n$/.test(actual), actual) | ||
logger.log({moar: 'data'}); | ||
var actual = logfmt2.stream.logline; | ||
assert(/^ns=logfmt foo=bar moar=data elapsed=\dms\n$/.test(actual), | ||
actual) | ||
}) | ||
}) |
var logfmt = require('../logfmt'), | ||
assert = require('assert'); | ||
//avoid test bleeding | ||
var logfmt = new logfmt; | ||
var OutStream = require('./outstream'); | ||
@@ -17,2 +20,3 @@ | ||
assert.equal('', logfmt.stream.logline); | ||
done(); | ||
}; | ||
@@ -31,3 +35,2 @@ | ||
assert(expectation.test(actual), actual); | ||
done(); | ||
}) | ||
@@ -40,2 +43,3 @@ | ||
assert.equal('method=GET status=200\n', logfmt.stream.logline); | ||
done() | ||
}; | ||
@@ -50,3 +54,2 @@ | ||
logger(mockReq, mockRes, next) | ||
done() | ||
}) | ||
@@ -68,2 +71,3 @@ | ||
assert.equal('foo', actual.content_length); | ||
done() | ||
}; | ||
@@ -73,3 +77,2 @@ | ||
logger(mockReq, mockRes, next) | ||
done() | ||
}) | ||
@@ -83,2 +86,3 @@ | ||
assert.equal('', logfmt.stream.logline); | ||
done() | ||
}; | ||
@@ -97,3 +101,2 @@ | ||
assert(expectation.test(actual), actual); | ||
done() | ||
}) | ||
@@ -216,2 +219,3 @@ | ||
assert.equal('namespacetest', actual.ns); | ||
done() | ||
}; | ||
@@ -221,5 +225,3 @@ | ||
logger(mockReq, mockRes, next) | ||
done() | ||
}) | ||
}) |
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
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
45
0
54850
1275
341