132 votes

Ajout d'un horodatage à tous les messages de la console

J'ai un complet, déployé Ce projet est basé sur Express et comporte de nombreuses instructions console.log() et console.error(). Le projet s'exécute en utilisant forever, dirigeant le stdout et le stderr vers 2 fichiers séparés.

Tout fonctionne très bien, mais il me manque maintenant les timestamps - pour savoir exactement quand les erreurs se sont produites.

Je peux faire une sorte de recherche/remplacement dans tout mon code, ou utiliser un module npm qui remplace la console dans chaque fichier, mais je ne veux pas toucher à chaque fichier de modèle/route, sauf si je dois absolument le faire.

Existe-t-il un moyen, peut-être un middleware Express, qui me permettrait d'ajouter un horodatage à chaque appel effectué, ou dois-je l'ajouter manuellement ?

149voto

Traveling Tech Guy Points 6975

Il s'avère que vous puede remplacer les fonctions de la console en haut du fichier app.js, et faire en sorte que cela prenne effet dans tous les autres modules. J'ai obtenu des résultats mitigés parce qu'un de mes modules est bifurqué en tant que child_process . Une fois que j'ai copié la ligne en haut de ce fichier également, tout fonctionne.

Pour mémoire, j'ai installé le module cachet de la console ( npm install console-stamp --save ), et ajouté cette ligne en haut de app.js et childProcess.js :

// add timestamps in front of log messages
require('console-stamp')(console, '[HH:MM:ss.l]');

Mon problème maintenant était que le :date du logger connect utilise le format UTC, plutôt que celui que j'utilise dans les autres appels de la console. Cela a été facilement corrigé en enregistrant mon propre format d'heure (et, par effet secondaire, en exigeant l'utilisation de l'attribut dateformat module qui console stamp livré avec, plutôt que d'en installer un autre) :

// since logger only returns a UTC version of date, I'm defining my own date format - using an internal module from console-stamp
express.logger.format('mydate', function() {
    var df = require('console-stamp/node_modules/dateformat');
    return df(new Date(), 'HH:MM:ss.l');
});
app.use(express.logger('[:mydate] :method :url :status :res[content-length] - :remote-addr - :response-time ms'));

Maintenant, mes fichiers journaux sont organisés (et mieux encore, analysables) :

[15:09:47.746] staging server listening on port 3000
[15:09:49.322] connected to database server xxxxx successfully
[15:09:52.743] GET /product 200 - - 127.0.0.1 - 214 ms
[15:09:52.929] GET /stylesheets/bootstrap-cerulean.min.css 304 - - 127.0.0.1 - 8 ms
[15:09:52.935] GET /javascripts/vendor/require.js 304 - - 127.0.0.1 - 3 ms
[15:09:53.085] GET /javascripts/product.js 304 - - 127.0.0.1 - 2 ms
...

84voto

Sunding Wei Points 56

Le module log-timestamp fonctionne pour moi.

npm install log-timestamp

Il est simple à utiliser :

console.log('Before log-timestamp');
require('log-timestamp');
console.log('After log-timestamp');

Before log-timestamp
[2012-08-23T20:08:32.000Z] After log-timestamp

37voto

Andreas Hultgren Points 4235

Créez un fichier avec les éléments suivants :

var log = console.log;

console.log = function(){
  log.apply(console, [Date.now()].concat(arguments));
};

Exigez-le dans votre application avant d'enregistrer quoi que ce soit. Faites de même pour console.error si nécessaire.

Notez que cette solution détruira l'insertion de variables ( console.log("he%s", "y") // "hey" ) si vous l'utilisez. Si vous en avez besoin, enregistrez d'abord l'horodatage :

log.call(console, Date.now());
log.apply(console, arguments);

27voto

leszek.hanusz Points 1285

Si vous voulez une solution sans autre dépendance externe mais que vous souhaitez conserver toutes les fonctionnalités de console.log (paramètres multiples, insertion de variables), vous pouvez utiliser le code suivant :

var log = console.log;

console.log = function () {
    var first_parameter = arguments[0];
    var other_parameters = Array.prototype.slice.call(arguments, 1);

    function formatConsoleDate (date) {
        var hour = date.getHours();
        var minutes = date.getMinutes();
        var seconds = date.getSeconds();
        var milliseconds = date.getMilliseconds();

        return '[' +
               ((hour < 10) ? '0' + hour: hour) +
               ':' +
               ((minutes < 10) ? '0' + minutes: minutes) +
               ':' +
               ((seconds < 10) ? '0' + seconds: seconds) +
               '.' +
               ('00' + milliseconds).slice(-3) +
               '] ';
    }

    log.apply(console, [formatConsoleDate(new Date()) + first_parameter].concat(other_parameters));
};

Vous pouvez modifier la fonction formatConsoleDate pour formater la date comme vous le souhaitez.

Ce code ne doit être écrit qu'une seule fois en plus de votre fichier JavaScript principal.

console.log("he%s", "y") imprimera quelque chose comme ceci :

[12:22:55.053] hey

12voto

Chetan Points 759

Vous pouvez également utiliser le log-timestamp paquet. Il est assez simple et personnalisable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X