web-dev-qa-db-fra.com

Quelle est la meilleure pratique pour la journalisation expressj?

Je construis une application basée sur expressjs et j'aimerais y enregistrer tous les événements. Je pourrais trouver Winston, qui semble être cool. Quoi qu'il en soit, je cherche un moyen de le connecter à mon application Expressjs.

Ce que je veux aussi, c'est me connecter à l'intérieur de l'application. Mes reqeusts ne sont pas si simples, je voudrais donc tout enregistrer dans mon application (pas seulement les demandes).

Ma situation actuelle:

server.js (je voudrais enregistrer les requêtes http à ce niveau)

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/quelque chose.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); });
};

contrôleur/quelque chose.js (je voudrais utiliser le même enregistreur pour l'enregistrement du débogage)

/**
 * 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;

L'autre chose à laquelle je songe est de consigner tous les événements dans des fonctions appelées à partir de contrôleurs (par exemple, des modèles ou d'autres bibliothèques).

Je pense donc que le bon moyen de créer une bibliothèque de consignateurs s’appellera par:

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

contenant la définition de l'enregistreur. L'autre problème que je ne sais pas comment résoudre est comment préfixer les données. Vous savez, j'ai beaucoup de demandes simultanées et j'aimerais voir quel message de débogage a été appelé par chaque demande.

47
Yarik Dot

Nous utilisons winston , il s’agit probablement du programme de journalisation le plus robuste.

Nous avons fini par le mettre en place exactement comme vous l'avez suggéré. Créer une bibliothèque commune utilisée pour encapsuler l'objet de journalisation autour de nos définitions et de nos transports, puis gérer tout autre type d'objet que nous voulons gérer différemment.

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

27
Ryan Gibbons

Si vous utilisez Express, vous voudrez peut-être consulter express-winston package. Ensuite, vous pouvez utiliser Winston comme middleware et consigner facilement les requêtes/erreurs sans alourdir votre code ... 

9
ciny

J'aime la journalisation de type Rails suivante:

[2017-11-02T11:13:54.545 #07738a81] Started GET /api/url for 10.0.0.1
[2017-11-02T11:13:54.550 #07738a81] Completed 200 31739 in 5.635 ms

Le code ci-dessous le fait

addRequestId = require('express-request-id')(setHeader: false)
app.use(addRequestId)

morgan = require('morgan')
morgan.token('id', (req) -> req.id.split('-')[0])

app.use(morgan(
  "[:date[iso] #:id] Started :method :url for :remote-addr",
  immediate: true))

app.use(morgan("
  [:date[iso] #:id] Completed :status :res[content-length] in :response-time ms"))

app.use('/api', router)
0
Hirurg103