1. ホーム
  2. node.js

[解決済み] expressjsのログ取得のベストプラクティスは?

2022-03-03 22:35:29

質問

私はexpressjsに基づいてアプリケーションを構築しており、その中のすべてのイベントをログに記録したいと思います。私はwinstonを見つけることができ、それはクールであるように思われます。とにかく、私はそれを私のexpressjsアプリに接続する方法を探しています。

私が欲しいのは、アプリケーション内のロギングです。私のリクエストはそれほど単純ではないので、私のアプリの内部ですべてをログに記録したいと思います(リクエストだけでなく)。

私の現在の状況

server.js (このレベルでhttpリクエストのログを取りたい)

var express = require('express');
var app = express();
var fs = require('fs');

// Post parser
app.configure(function(){
    app.use(express.bodyParser());
});

// Load routes
require('fs').readdirSync(__dirname + '/routes').forEach(function(file) {
    require(__dirname + '/routes/' + file)(app);
});

// 404: Not found
app.use(function(req, res, next){
    res.json(404, {ERROR: 'Page not found.'});
});

// 500: Error reporing
app.use(function(err, req, res, next){
    console.error(err.stack);
    res.json(500, {ERROR: 'Internal server error.'} );
});

// Startup new server
app.listen(900);

routes/something.js

var something = require(__dirname + '/../controller/something.js');

module.exports = function(app) {
    app.get('/v1/something', function(req, res, next) { new something().getAll(req, res, next); });
};

controller/something.js (デバッグログも同じロガーを使いたいので)

/**
 * Constructor
 *
 */
function Something() {
};

/**
 * Get all the data
 *
 */
Something.prototype.getAll = function(req, res, next) {
    // I want to log some very important information here
    res.json({result: true, data: ['hello', 'hi', 'ciao', 'buf']});
}

module.exports = Something;

もうひとつ考えているのは、コントローラから呼び出される関数(モデルや他のライブラリなど)のイベントをすべてログに記録することです。

そこで、ロガーライブラリを作成し、それを使用して呼び出すのが良い方法だと思います。

var logger = require(__dirname + '/../libraries/logger.js');

ロガーの定義が含まれています。もう一つの問題は、データのプレフィックスをどうするかということです。私は多くの同時リクエストを持ち、それぞれのリクエストによって呼び出されたデバッグメッセージを確認したいのです。

解決方法は?

私たちは ウィンストン これはおそらく最も堅牢なロギング・パッケージでしょう。

結局、あなたが提案したとおりにセットアップすることになりました。ロガーオブジェクトを私たちの定義とトランスポートにラップするために使用される共通のライブラリを作成し、その後、別の方法で処理させたい他のタイプのオブジェクトを処理します。

https://gist.github.com/rtgibbons/7354879