web-dev-qa-db-ja.com

restifyを使用してコンソールにすべてのリクエストを記録する方法はありますか?

私はrestifyを使用してAPIを構築しており、expressに慣れています。 restifyapp.use(express.logger('dev'))で行うように、コンソールですべてのリクエストをexpressに記録させる方法はありますか?

14
Samuel Bolduc

これは、すべてのリクエストをログに記録する非常に骨の折れるRestify/Bunyanの例です。

_'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()呼び出しです。

1つのターミナルウィンドウで起動し、別のターミナルウィンドウでcurlリクエストを実行します。動作した応答と、要求のログエントリが表示されます。

いくつかのことを想定しています:

  • Bunyanをインストールして再認証するpackage.jsonファイルがあります
  • 上記のコードを_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_を見たい場合は、これらすべてを要点にまとめることができます。

22
jamie young

Expressで使用される Morgan ロガーミドルウェアを使用することもできます。 Restifyは意図的に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);
});

このようになる:

enter image description here

12
Javier Cadiz

RequestLoggerの使用に関しては、 ドキュメント のこのコメントを参照してください。

「このプラグインは、個々のリクエストをログに記録しません。監査ログプラグインまたはカスタムミドルウェアを使用してください。」

監査ログ( docs

監査ログは、.use()では使用せず、afterイベントで使用するため、特別なプラグインです。

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

開発環境で使用したいだけの場合は、すばやく実行する方法があります。

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

デフォルトでは、restifyBunyan ロガーを使用します。再確認ドキュメントから

RequestLogger定義した他のパラメーターとともに、現在のリクエストIDが入力された子bunyanロガーを設定します。

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

これにオプションを渡すことはできません。その場合、リクエストIDのみが追加され、シリアライザーは追加されません(これも最もパフォーマンスが高くなります)。サーバーの作成時に作成されたロガーが親ロガーとして使用されます。

0
Gntem