I'm using restify
to build an API, and I'm used to express
. Is there a way to have restify
log every request in the console, like express
does with app.use(express.logger('dev'))
?
Is there a way to log every request in the console with restify?
18.4k Views Asked by Samuel Bolduc AtThere are 6 best solutions below

By default restify
uses Bunyan logger. From restify documentation
RequestLogger Sets up a child bunyan logger with the current request id filled in, along with any other parameters you define.
server.use(restify.requestLogger({
properties: {
foo: 'bar'
},
serializers: {...}
}));
You can pass in no options to this, in which case only the request id will be appended, and no serializers appended (this is also the most performant); the logger created at server creation time will be used as the parent logger.

I wrote something to do this. It's still being developed, but it seems to work so far. npm install restify-dev-logger, then
var logger = require("restify-dev-logger");
var restify = require("restify");
var srv = restify.createServer(...);
srv.use(logger.dev);
Or something like that. There's also logger.devbw, which doesn't have pretty terminal colors.
UPDATE: My package is broken (not sure why), but a workable replacement is here: https://groups.google.com/forum/?hl=en&fromgroups#!topic/restify/iLRiYz3Fko0

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:
Here is a very bare bones Restify/Bunyan example that will log every request:
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:
server.js
You would do/see the following:
Terminal Window 1
Terminal Window 2
If anyone would like to see my
package.json
I can put all of this up in a gist.