Есть ли способ зарегистрировать каждый запрос в консоли с повторением?

Я использую restify для создания API, и я привык к express. Есть ли способ иметь restify регистрировать каждый запрос в консоли, например express с app.use(express.logger('dev'))?

Ответ 1

Вот пример с редкими/бунианскими костями, которые будут регистрировать каждый запрос:

'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);
});

Ключом к этому является вызов server.pre().

Запустите его в одном окне терминала и выполните запрос на завивание в другом окне терминала. Вы увидите ответ, который он сработал, и запись в журнале для запроса.

Предполагая несколько вещей:

  • У вас есть файл package.json, который установит bunyan и восстановит
  • Вы помещаете код выше в файл с именем server.js

Вы бы сделали/увидели следующее:

Окно терминала 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}

Окно терминала 2

$ curl localhost:8080/
"It worked!"

Если кто-то захочет увидеть мой package.json, я могу все это выразить в сущности.

Ответ 2

Вы также можете использовать Morgan промежуточное ПО протокола, используемое в Express. Поскольку Reify намеренно сильно зависит от Express, настройте его точно так же.

Вот как Пример сервера использования получает:

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);
});

Как выглядит:

введите описание изображения здесь

Ответ 3

Что касается использования RequestLogger, см. этот комментарий в :

"Этот плагин не регистрирует каждый отдельный запрос. Используйте плагин Audit Logging или настраиваемое промежуточное программное обеспечение для этого использования.

Аудит ведения журнала (docs)

Журналирование аудита - это специальный плагин, поскольку вы не используете его с .use(), но с событием after:

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

Ответ 4

По умолчанию restify использует Bunyan регистратор. Из документа подтверждения

RequestLogger Устанавливает дочерний логгер bunyan с текущим запросом id заполняется вместе с любыми другими параметрами, которые вы определяете.

    server.use(restify.requestLogger({
        properties: {
            foo: 'bar'
        },
        serializers: {...}
    })); 

Вы не можете передать никакие опции, и в этом случае будет добавлен только идентификатор запроса, а добавление сериализаторов (это также самый результативный); журнал, созданный во время создания сервера, будет используется в качестве родительского регистратора.

Ответ 5

Существует быстрый способ сделать это очень быстро, если вы просто хотите использовать его для своей среды разработки.

/**
 * Log requests.
 */
server.on('after', function(req, res, route, error) {
    console.log("------------------------")
    console.log(req.route.path)
    console.log(req.body)
});

Ответ 6

Я написал что-то для этого. Он все еще развивается, но, похоже, он работает до сих пор. npm install restify-dev-logger, затем

var logger = require("restify-dev-logger");
var restify = require("restify");
var srv = restify.createServer(...);
srv.use(logger.dev);

Или что-то в этом роде. Там также logger.devbw, который не имеет довольно ярких цветов.

UPDATE: мой пакет поврежден (не уверен, почему), но работоспособная замена находится здесь: https://groups.google.com/forum/?hl=en&fromgroups#!topic/restify/iLRiYz3Fko0