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 ?

7voto

George Y. Points 4269

Cette implémentation est simple, supporte la fonctionnalité originale de console.log (passage d'un seul objet, et substitution de variable), n'utilise pas de modules externes et imprime tout en un seul appel à console.log :

var origlog = console.log;

console.log = function( obj, ...placeholders ){
    if ( typeof obj === 'string' )
        placeholders.unshift( Date.now() + " " + obj );
    else
    {
        // This handles console.log( object )
        placeholders.unshift( obj );
        placeholders.unshift( Date.now() + " %j" );
    }

    origlog.apply( this, placeholders );
};

7voto

Shivam Shekhar Points 63

Si vous le souhaitez, vous pouvez créer un enregistreur personnalisé pour votre application en étendant la classe "Console" intégrée à Node. Veuillez vous référer à l'implémentation suivante

"use strict";

const moment = require('moment');
const util = require('util');
const Console = require('console').Console;

class Logger extends Console {
    constructor(stdout, stderr, ...otherArgs) {
        super(stdout, stderr, ...otherArgs);
    }

    log(...args) {
        super.log(moment().format('D MMM HH:mm:ss'), '-', util.format(...args));
    }

    error(...args) {
        super.error(moment().format('D MMM HH:mm:ss'), '-', util.format(...args));
    }
}

module.exports = (function() {
    return new Logger(process.stdout, process.stderr); 
}());

Après cela, vous pouvez l'utiliser dans votre code comme :

const logger = require('./logger');

logger.log('hello world', 123456);
logger.error('some error occurred', err);

6voto

Manuel Sansone Points 167

Une approche plus rudimentaire, pour éviter d'installer des modules externes, pourrait consister à implémenter une fonction simple telle que :

function timeStamp(message){
    console.log ( '[' + new Date().toISOString().substring(11,23) + '] -', message )
}

et ensuite je l'appelle simplement de cette façon :

timeStamp('this is my logline!!');

le résultat sera :

 LOG  [15:22:30.682] - this is my logline!!

Bien sûr, vous pouvez formater la date dans le meilleur format possible et étendre la fonction à console.error, debug, etc.

3voto

Ce n'est pas une réponse directe, mais avez-vous regardé dans winston.js ? Il a une tonne d'options de journalisation supplémentaires, y compris la journalisation vers un fichier json ou une base de données. Ceux-ci ont toujours des horodatages par défaut. Juste une idée.

3voto

thxmxx Points 229
app.use(morgan('[:date[web]] :method :url :status :res[content-length] - :remote-addr - :response-time ms'))

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