Is there a way to log every request in the console with restify?

Here is a very bare bones Restify/Bunyan example that will log every request:

'use strict';

var Logger = require('bunyan'),
    restify = require('restify'),
    log = new Logger.createLogger({
        name: 'app-name',
        serializers: {
            req: Logger.stdSerializers.req
        }
    }),
    server = restify.createServer({
        name: 'app-name',
        version: '0.1.0',
        log: log
    });

server.pre(function (request, response, next) {
    request.log.info({ req: request }, 'REQUEST');
    next();
});

server.get('/', function (request, response, next) {
    response.send('It worked!');
    next();
});

server.listen(8080, function () {
    console.log('%s listening at %s', server.name, server.url);
});

The key to this is the server.pre() call.

Start it up in one terminal window and do a curl request in another terminal window. You will see the response that it worked, and a log entry for the request.

Assuming a few things:

  • You have a package.json file that will install bunyan and restify
  • You put the code above in a file named server.js

You would do/see the following:

Terminal Window 1

$ node server.js
app-name listening at http://0.0.0.0:8080
{"name":"app-name","hostname":"leeloo.local","pid":97387,"level":30,"req":{"method":"GET","url":"/","headers":{"user-agent":"curl/7.30.0","host":"localhost:8080","accept":"*/*"},"remoteAddress":"127.0.0.1","remotePort":60870},"msg":"REQUEST","time":"2014-04-21T17:55:52.487Z","v":0}

Terminal Window 2

$ curl localhost:8080/
"It worked!"

If anyone would like to see my package.json I can put all of this up in a gist.


In reference to using RequestLogger, see this comment in the docs:

"This plugin does not log each individual request. Use the Audit Logging plugin or a custom middleware for that use."

Audit Logging (docs)

Audit logging is a special plugin, as you don't use it with .use(), but with the after event:

server.on('after', restify.auditLogger({
  log: bunyan.createLogger({
    name: 'audit',
    stream: process.stdout
  })
}));

You could also use the Morgan logger middleware used in Express. Since Restify intentionally borrows heavily from Express, configure it is exactly the same.

This is how the Usage server example gets:

var restify = require('restify');
var logger  = require('morgan')

var server = restify.createServer({
  name: 'myapp',
  version: '1.0.0'
});

server.use(logger('dev'));
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());

server.get('/echo/:name', function (req, res, next) {
  res.send(req.params);
  return next();
});

server.listen(8080, function () {
  console.log('%s listening at %s', server.name, server.url);
});

Getting like this:

enter image description here