- Notifications
You must be signed in to change notification settings - Fork0
🌲 pino logging koa middleware
License
AllegorithmicSAS/koa-pino-logger
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Note: For Koa v1 seev1 readme
To our knowledge,koa-pino-logger
is thefastest JSONkoa logger in town.
Benchmarks log each request/response pair while returning'hello world'
, usingautocannon with 100connections and pipelining set to 1 (koa can't handle pipelining):autocannon -c 100 -p 1 http://localhost:3000
.
koa-bunyan-logger
: 5844 req/seckoa-logger
: 9401 req/seckoa-morgan
: 10881 req/seckoa-pino-logger
: 10534 req/seckoa-pino-logger
(extreme): 11112 req/sec- koa w/out logger: 14518 req/sec
All benchmarks where taken on a Macbook Pro 2013 (2.6GHZ i7, 16GB of RAM).
Benchmarking againstkoa-logger
is an apples vs oranges situation.koa-logger
is for development logging, and has extremely simple (non-JSON) output. Still,koa-pino-logger
is faster so... why not.
Additionally, whilst we're comparingkoa-pino-logger
againstkoa-morgan, this isn't really a fair contest.
Morgan doesn't support logging arbitrary data, nor does it output JSON. Further Morganuses a form ofeval
to achieve high speed logging. Whilst probably safe, usingeval
at all tends to cause concern, particular when it comes to server-side JavaScript.
The fact thatkoa-pino-logger
achieves similar throughput with JSON loggingand arbitrary data, without usingeval
, serves to emphasise the high-speed capabilities ofkoa-pino-logger
.
Withkoa-pino-logger
you can have features, safetyand speed.
npm install --save koa-pino-logger
'use strict'varkoa=require('koa')varlogger=require('koa-pino-logger')varapp=newKoa()app.use(logger())app.use((ctx)=>{ctx.log.info('something else')ctx.body='hello world'})app.listen(3000)
$ node example.js | pino[2016-04-21T10:46:47.292Z] INFO (18254 on MacBook-Pro-4.local): something else req: { "id": 1, "method": "GET", "url": "/", "headers": { "host": "localhost:3000", "user-agent": "curl/7.43.0", "accept": "*/*" }, "remoteAddress": "::1", "remotePort": 64839 }[2016-04-21T10:46:47.300Z] INFO (18254 on MacBook-Pro-4.local): request completed res: { "statusCode": 200, "header": "HTTP/1.1 200 OK\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 11\r\nDate: Thu, 21 Apr 2016 10:46:47 GMT\r\nConnection: keep-alive\r\n\r\n" } responseTime: 8 req: { "id": 1, "method": "GET", "url": "/", "headers": { "host": "localhost:3000", "user-agent": "curl/7.43.0", "accept": "*/*" }, "remoteAddress": "::1", "remotePort": 64839 }
'use strict'varkoa=require('koa')varlogger=require('koa-pino-logger')varapp=newKoa()app.silent=true// disable console.errorsapp.use(logger())app.use((ctx)=>{ctx.body='hello world'throwError('bang!')})app.listen(3000)
$ node error-example.js | pino$ node error-example.js | pino[2016-04-21T13:05:10.298Z] ERROR (20482 on MacBook-Pro-4.local): request errored res: { "statusCode": 200, "header": null } err: { "type": "Error", "message": "bang!", "stack": "Error: bang!\n at Error (native)\n at /Users/davidclements/z/nearForm/koa-pino-logger/error-example.js:12:9\n at dispatch (/Users/davidclements/z/nearForm/koa-pino-logger/node_modules/koa/node_modules/koa-compose/index.js:43:32)\n at next (/Users/davidclements/z/nearForm/koa-pino-logger/node_modules/koa/node_modules/koa-compose/index.js:44:18)\n at pino (/Users/davidclements/z/nearForm/koa-pino-logger/logger.js:13:12)\n at dispatch (/Users/davidclements/z/nearForm/koa-pino-logger/node_modules/koa/node_modules/koa-compose/index.js:43:32)\n at /Users/davidclements/z/nearForm/koa-pino-logger/node_modules/koa/node_modules/koa-compose/index.js:36:12\n at Server.<anonymous> (/Users/davidclements/z/nearForm/koa-pino-logger/node_modules/koa/lib/application.js:135:7)\n at emitTwo (events.js:100:13)\n at Server.emit (events.js:185:7)" } req: { "id": 1, "method": "GET", "url": "/", "headers": { "host": "localhost:3000", "user-agent": "curl/7.43.0", "accept": "*/*" }, "remoteAddress": "::1", "remotePort": 50934 }[2016-04-21T13:05:10.305Z] INFO (20482 on MacBook-Pro-4.local): request completed res: { "statusCode": 500, "header": "HTTP/1.1 500 Internal Server Error\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 21\r\nDate: Thu, 21 Apr 2016 13:05:10 GMT\r\nConnection: keep-alive\r\n\r\n" } responseTime: 11 req: { "id": 1, "method": "GET", "url": "/", "headers": { "host": "localhost:3000", "user-agent": "curl/7.43.0", "accept": "*/*" }, "remoteAddress": "::1", "remotePort": 50934 }
koa-pino-logger
has the same options aspinokoa-pino-logger
will log when a request finishes or errors.
Along with automated request logging, the pino logger facilitates manual loggingby adding the pino logger instance to the the context, request, response, req and res objects:
app.use((ctx,next)=>{ctx.log.info('test 1')ctx.request.log.info('test 2')ctx.response.log.info('test 3')ctx.res.log.info('test 4')ctx.req.log.info('test 5')returnnext()})
We recommend usingctx.log
in the general case.
MIT