Comparing version 0.2.5 to 0.3.0
{ | ||
"name": "pino", | ||
"version": "0.2.5", | ||
"version": "0.3.0", | ||
"description": "fast and simple logger", | ||
@@ -5,0 +5,0 @@ "main": "pino.js", |
66
pino.js
@@ -38,2 +38,3 @@ 'use strict' | ||
} | ||
var serializers = opts.serializers || {} | ||
@@ -80,2 +81,8 @@ for (var key in levels) { | ||
base = 1 | ||
if (obj.method && obj.headers && obj.socket) { | ||
obj = mapHttpRequest(obj) | ||
} else if (obj.statusCode) { | ||
obj = mapHttpResponse(obj) | ||
} | ||
} else { | ||
@@ -96,3 +103,4 @@ params = [a, b, c, d, e, f, g, h, i, j, k] | ||
} | ||
var data = JSON.stringify(new Message(num, msg)) | ||
var data = message(num, msg) | ||
var value | ||
if (obj) { | ||
@@ -105,4 +113,6 @@ data = data.slice(0, data.length - 1) | ||
for (var key in obj) { | ||
if (obj.hasOwnProperty(key) && obj[key] !== undefined) { | ||
data += ',"' + key + '":' + stringify(obj[key]) | ||
value = obj[key] | ||
if (obj.hasOwnProperty(key) && value !== undefined) { | ||
value = serializers[key] ? serializers[key](value) : value | ||
data += ',"' + key + '":' + stringify(value) | ||
} | ||
@@ -116,10 +126,10 @@ } | ||
function Message (level, msg) { | ||
this.pid = pid | ||
this.hostname = hostname | ||
this.name = name | ||
this.level = level | ||
this.msg = msg && msg.toString() | ||
this.time = new Date() | ||
this.v = 0 | ||
function message (level, msg) { | ||
return '{"pid":' + pid + ',' + | ||
(typeof hostname === 'undefined' ? '' : '"hostname":"' + hostname + '",') + | ||
(typeof name === 'undefined' ? '' : '"name":"' + name + '",') + | ||
'"level":' + level + ',' + | ||
(typeof msg === 'undefined' ? '' : '"msg":"' + (msg && msg.toString()) + '",') + | ||
'"time":"' + (new Date()).toISOString() + '",' + | ||
'"v":' + 0 + '}' | ||
} | ||
@@ -130,2 +140,36 @@ } | ||
function mapHttpRequest (req) { | ||
return { | ||
req: asReqValue(req) | ||
} | ||
} | ||
function mapHttpResponse (res) { | ||
return { | ||
res: asResValue(res) | ||
} | ||
} | ||
function asReqValue (req) { | ||
return { | ||
method: req.method, | ||
url: req.url, | ||
headers: req.headers, | ||
remoteAddress: req.connection.remoteAddress, | ||
remotePort: req.connection.remotePort | ||
} | ||
} | ||
function asResValue (res) { | ||
return { | ||
statusCode: res.statusCode, | ||
header: res._header | ||
} | ||
} | ||
module.exports = pino | ||
module.exports.stdSerializers = { | ||
req: asReqValue, | ||
res: asResValue | ||
} |
112
README.md
@@ -13,2 +13,3 @@ # pino | ||
* [How do I rotate log files?](#rotate) | ||
* [Acknowledgements](#acknowledgements) | ||
* [License](#license) | ||
@@ -66,2 +67,4 @@ | ||
* <a href="#trace"><code>logger.<b>trace()</b></code></a> | ||
* <a href="#reqSerializer"><code>pino.stdSerializers.<b>req</b></code></a> | ||
* <a href="#resSerializer"><code>pino.stdSerializers.<b>res</b></code></a> | ||
@@ -76,5 +79,24 @@ <a name="constructor"></a> | ||
* `name`: the name of the logger, default `undefined` | ||
* `serializers`: an object containing functions for custom serialization | ||
of objects. These functions should return an jsonificable object and | ||
they should never throw. | ||
`stream` is a Writable stream, defaults to `process.stdout`. | ||
Example: | ||
```js | ||
'use strict' | ||
var pino = require('pino') | ||
var instance = pino({ | ||
name: 'myapp', | ||
safe: true, | ||
serializers: { | ||
req: pino.stdSerializers.req | ||
res: pino.stdSerializers.res | ||
} | ||
} | ||
``` | ||
<a name="level"></a> | ||
@@ -145,2 +167,55 @@ ### logger.level | ||
<a name="reqSerializer"></a> | ||
### pino.stdSerializers.req | ||
Function to generate a jsonificable object out of an HTTP request from | ||
node HTTP server. | ||
It returns an object in the form: | ||
```js | ||
{ | ||
pid: 93535, | ||
hostname: 'your host', | ||
level: 30, | ||
msg: 'my request', | ||
time: '2016-03-07T12:21:48.766Z', | ||
v: 0, | ||
req: { | ||
method: 'GET', | ||
url: '/', | ||
headers: { | ||
host: 'localhost:50201', | ||
connection: 'close' | ||
}, | ||
remoteAddress: '::ffff:127.0.0.1', | ||
remotePort: 50202 | ||
} | ||
} | ||
``` | ||
<a name="resSerializer"></a> | ||
### pino.stdSerializers.res | ||
Function to generate a jsonificable object out of an HTTP | ||
response from | ||
node HTTP server. | ||
It returns an object in the form: | ||
```js | ||
{ | ||
pid: 93581, | ||
hostname: 'myhost', | ||
level: 30, | ||
msg: 'my response', | ||
time: '2016-03-07T12:23:18.041Z', | ||
v: 0, | ||
res: { | ||
statusCode: 200, | ||
header: 'HTTP/1.1 200 OK\r\nDate: Mon, 07 Mar 2016 12:23:18 GMT\r\nConnection: close\r\nContent-Length: 5\r\n\r\n' | ||
} | ||
} | ||
``` | ||
<a name="benchmarks"></a> | ||
@@ -152,18 +227,18 @@ ## Benchmarks | ||
``` | ||
benchBunyan*10000: 1128ms | ||
benchWinston*10000: 1903ms | ||
benchBole*10000: 1511ms | ||
benchPino*10000: 439ms | ||
benchBunyanObj*10000: 1209ms | ||
benchWinstonObj*10000: 1948ms | ||
benchPinoObj*10000: 526ms | ||
benchBoleObj*10000: 1466ms | ||
benchBunyan*10000: 1064ms | ||
benchWinston*10000: 1827ms | ||
benchBole*10000: 1524ms | ||
benchPino*10000: 438ms | ||
benchBunyanObj*10000: 1220ms | ||
benchWinstonObj*10000: 2119ms | ||
benchPinoObj*10000: 524ms | ||
benchBoleObj*10000: 1522ms | ||
benchBunyan*10000: 1116.721ms | ||
benchWinston*10000: 1783.362ms | ||
benchBole*10000: 1496.580ms | ||
benchPino*10000: 363.430ms | ||
benchBunyanObj*10000: 1228.538ms | ||
benchWinstonObj*10000: 1895.251ms | ||
benchPinoObj*10000: 427.989ms | ||
benchBoleObj*10000: 1487.543ms | ||
benchBunyan*10000: 1088.231ms | ||
benchWinston*10000: 1733.589ms | ||
benchBole*10000: 1514.004ms | ||
benchPino*10000: 377.418ms | ||
benchBunyanObj*10000: 1205.833ms | ||
benchWinstonObj*10000: 1800.594ms | ||
benchPinoObj*10000: 412.170ms | ||
benchBoleObj*10000: 1522.469ms | ||
``` | ||
@@ -198,4 +273,9 @@ | ||
<a name="acknowledgements"></a> | ||
## Acknowledgements | ||
This project was kindly sponsored by [nearForm](http://nearform.com). | ||
## License | ||
MIT |
155
test.js
@@ -8,2 +8,3 @@ 'use strict' | ||
var split = require('split2') | ||
var http = require('http') | ||
var pid = process.pid | ||
@@ -254,1 +255,155 @@ var hostname = os.hostname() | ||
}) | ||
test('http request support', function (t) { | ||
t.plan(3) | ||
var originalReq | ||
var instance = pino(sink(function (chunk, enc, cb) { | ||
t.ok(Date.parse(chunk.time) <= new Date(), 'time is greater than Date.now()') | ||
delete chunk.time | ||
t.deepEqual(chunk, { | ||
pid: pid, | ||
hostname: hostname, | ||
level: 30, | ||
msg: 'my request', | ||
v: 0, | ||
req: { | ||
method: originalReq.method, | ||
url: originalReq.url, | ||
headers: originalReq.headers, | ||
remoteAddress: originalReq.connection.remoteAddress, | ||
remotePort: originalReq.connection.remotePort | ||
} | ||
}) | ||
cb() | ||
})) | ||
var server = http.createServer(function (req, res) { | ||
originalReq = req | ||
instance.info(req, 'my request') | ||
res.end('hello') | ||
}).listen(function (err) { | ||
t.error(err) | ||
t.teardown(server.close.bind(server)) | ||
http.get('http://localhost:' + server.address().port, function (res) { | ||
res.resume() | ||
}) | ||
}) | ||
}) | ||
test('http request support via serializer', function (t) { | ||
t.plan(3) | ||
var originalReq | ||
var instance = pino({ | ||
serializers: { | ||
req: pino.stdSerializers.req | ||
} | ||
}, sink(function (chunk, enc, cb) { | ||
t.ok(Date.parse(chunk.time) <= new Date(), 'time is greater than Date.now()') | ||
delete chunk.time | ||
t.deepEqual(chunk, { | ||
pid: pid, | ||
hostname: hostname, | ||
level: 30, | ||
msg: 'my request', | ||
v: 0, | ||
req: { | ||
method: originalReq.method, | ||
url: originalReq.url, | ||
headers: originalReq.headers, | ||
remoteAddress: originalReq.connection.remoteAddress, | ||
remotePort: originalReq.connection.remotePort | ||
} | ||
}) | ||
cb() | ||
})) | ||
var server = http.createServer(function (req, res) { | ||
originalReq = req | ||
instance.info({ req: req }, 'my request') | ||
res.end('hello') | ||
}).listen(function (err) { | ||
t.error(err) | ||
t.teardown(server.close.bind(server)) | ||
http.get('http://localhost:' + server.address().port, function (res) { | ||
res.resume() | ||
}) | ||
}) | ||
}) | ||
test('http response support', function (t) { | ||
t.plan(3) | ||
var originalRes | ||
var instance = pino(sink(function (chunk, enc, cb) { | ||
t.ok(Date.parse(chunk.time) <= new Date(), 'time is greater than Date.now()') | ||
delete chunk.time | ||
t.deepEqual(chunk, { | ||
pid: pid, | ||
hostname: hostname, | ||
level: 30, | ||
msg: 'my response', | ||
v: 0, | ||
res: { | ||
statusCode: originalRes.statusCode, | ||
header: originalRes._header | ||
} | ||
}) | ||
cb() | ||
})) | ||
var server = http.createServer(function (req, res) { | ||
originalRes = res | ||
res.end('hello') | ||
instance.info(res, 'my response') | ||
}).listen(function (err) { | ||
t.error(err) | ||
t.teardown(server.close.bind(server)) | ||
http.get('http://localhost:' + server.address().port, function (res) { | ||
res.resume() | ||
}) | ||
}) | ||
}) | ||
test('http response support via a serializer', function (t) { | ||
t.plan(3) | ||
var originalRes | ||
var instance = pino({ | ||
serializers: { | ||
res: pino.stdSerializers.res | ||
} | ||
}, sink(function (chunk, enc, cb) { | ||
t.ok(Date.parse(chunk.time) <= new Date(), 'time is greater than Date.now()') | ||
delete chunk.time | ||
t.deepEqual(chunk, { | ||
pid: pid, | ||
hostname: hostname, | ||
level: 30, | ||
msg: 'my response', | ||
v: 0, | ||
res: { | ||
statusCode: originalRes.statusCode, | ||
header: originalRes._header | ||
} | ||
}) | ||
cb() | ||
})) | ||
var server = http.createServer(function (req, res) { | ||
originalRes = res | ||
res.end('hello') | ||
instance.info({ res: res }, 'my response') | ||
}).listen(function (err) { | ||
t.error(err) | ||
t.teardown(server.close.bind(server)) | ||
http.get('http://localhost:' + server.address().port, function (res) { | ||
res.resume() | ||
}) | ||
}) | ||
}) |
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
Network access
Supply chain riskThis module accesses the network.
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
242273
667
276
1