express-pino-logger

by pinojs

🌲 an express middleware to log with pino

138 Stars 12 Forks Last release: 6 months ago (v5.0.0) MIT License 65 Commits 11 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

express-pino-logger  Build Status

An express middleware to log with pino. Incidentally, it also works without express.

To our knowledge,

express-pino-logger
is the fastest express logger in town.

Benchmarks

Benchmarks log each request/response pair while returning

'hello world'
, using autocannon with 100 connections and 10 pipelined requests (
autocannon -c 100 -p 10 http://localhost:3000
).
  • express-bunyan-logger
    : 2702 req/sec
  • express-winston
    : 5953 req/sec
  • morgan
    : 8570 req/sec
  • express-pino-logger
    : 9807 req/sec
  • express-pino-logger
    (extreme): 10407 req/sec
  • express-pino-logger
    (without express): 22240.73 req/seq
  • express-pino-logger
    (without express and extreme): 25536 req/sec

All benchmarks where taken on a Macbook Pro 2013 (2.6GHZ i7, 16GB of RAM).

Whilst we're comparing

express-pino-logger
against morgan, this isn't really a fair contest.

Morgan doesn't support logging arbitrary data, nor does it output JSON. Further Morgan uses a form of

eval
to achieve high speed logging. Whilst probably safe, using

eval
at all tends to cause concern, particular when it comes to server-side JavaScript.

The fact that

express-pino-logger
achieves higher throughput with JSON logging and arbitrary data, without using
eval
, serves to emphasise the high-speed capabilities of
express-pino-logger
.

With

express-pino-logger
you can have features, safety and speed.

Install

npm i express-pino-logger --save

Example

'use strict'

var app = require('express')() var pino = require('express-pino-logger')()

app.use(pino)

app.get('/', function (req, res) { // each request has its own id // so you can track the log of each request // by using req.log // the ids are cycled every 2^31 - 2 req.log.info('something else') res.send('hello world') })

app.listen(3000)

$ node example.js | pino-pretty
[2016-03-31T16:53:21.079Z] INFO (46316 on MBP-di-Matteo): something else
    req: {
      "id": 1,
      "method": "GET",
      "url": "/",
      "headers": {
        "host": "localhost:3000",
        "user-agent": "curl/7.43.0",
        "accept": "/"
      },
      "remoteAddress": "::1",
      "remotePort": 64386
    }
[2016-03-31T16:53:21.087Z] INFO (46316 on MBP-di-Matteo): request completed
    res: {
      "statusCode": 200,
      "header": "HTTP/1.1 200 OK\r\nX-Powered-By: Express\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 11\r\nETag: W/"b-XrY7u+Ae7tCTyyK7j1rNww"\r\nDate: Thu, 31 Mar 2016 16:53:21 GMT\r\nConnection: keep-alive\r\n\r\n"
    }
    responseTime: 10
    req: {
      "id": 1,
      "method": "GET",
      "url": "/",
      "headers": {
        "host": "localhost:3000",
        "user-agent": "curl/7.43.0",
        "accept": "/"
      },
      "remoteAddress": "::1",
      "remotePort": 64386
    }

Custom serializers

The

req
object for logging is constructed by pino-std-serializers and custom properties added to the
req
in previous middleware are not automatically included.

The original

req
is accessible in the custom serializer under
req.raw
.
'use strict'

var app = require('express')() var ExpressPinoLogger = require('express-pino-logger')()

var pino = ExpressPinoLogger({ serializers: { req: (req) => ({ method: req.method, url: req.url, user: req.raw.user, }), }, })

// middleware that augments the req - must be added before the pino middleware app.use((req, res, next) => { req.user = 'testing'; next(); })

app.use(pino)

...

API

express-pino-logger
has the same options of pino, look at them there.
express-pino-logger
attaches some listeners to the request, so that it will log when the request is completed.

You can also reuse an instance of

pino
 by passing it in the constructor with:
'use strict'

const pino = require('pino')() const expressPino = require('express-pino-logger')({ logger: pino })

License

MIT

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.