web-dev-qa-db-fra.com

Node.js console.log () dans un fichier txt

J'ai une autre question ( dernière question ). En ce moment, je travaille sur un projet Node.js et j’ai many console.log (). Cela a fonctionné sans problème jusqu'à présent, mais je veux aussi que tout ce qui est écrit sur la console soit aussi écrit dans un fichier journal. Quelqu'un peut-il m'aider s'il vous plaît? 

Par exemple:

Console.log('The value of array position [5] is '+ array[5]);

Dans mon vrai code, c'est un peu plus mais cela devrait vous donner une idée.

Merci j'espère.

15
Limatuz

J'utiliserais une bibliothèque au lieu de réinventer la roue. J'ai cherché une bibliothèque de type log4j- sur npm, et elle est arrivée avec https://github.com/nomiddlename/log4js-node

si vous souhaitez vous connecter à la console et à un fichier:

var log4js = require('log4js');
log4js.configure({
  appenders: [
    { type: 'console' },
    { type: 'file', filename: 'logs/cheese.log', category: 'cheese' }
  ]
});

maintenant votre code peut créer un nouvel enregistreur avec

var logger = log4js.getLogger('cheese'); 

et utilisez l'enregistreur dans votre code

logger.warn('Cheese is quite smelly.');
logger.info('Cheese is Gouda.');
logger.debug('Cheese is not a food.');
12
activedecay

Il suffit de lancer le script dans votre terminal comme ceci ...

node script-file.js > log-file.txt

Cela indique au shell d'écrire la sortie standard de la commande node script-file.js dans votre fichier journal au lieu de la valeur par défaut, qui est en train de l'imprimer sur la console.

Cela s'appelle redirection et c'est très puissant. Supposons que vous vouliez écrire toutes les erreurs dans un fichier séparé ...

node script-file.js >log-file.txt 2>error-file.txt

Maintenant, tous les console.log sont écrits dans log-file.txt et tous les console.error sont écrits dans error-file.txt

28
Charlie Martin

Vous pouvez essayer de remplacer le console.log intégré pour faire quelque chose de différent.

var originalLog = console.log;

console.log = function(str){
  originalLog(str);
  // Your extra code
}

Cependant, ceci place la originalLog dans la portée principale, vous devriez donc essayer de l'envelopper dans une fonction. Ceci s’appelle une fermeture, et vous pouvez en savoir plus à leur sujet ici .

(function(){
   var originalLog = console.log;

  console.log = function(str){
  originalLog(str);
  // Your extra code
})();

Pour écrire des fichiers, voir this question de stackoverflow, et remplacer console.log encore mieux que ce que j'ai montré, voir this . En combinant ces deux réponses, vous obtiendrez la meilleure solution possible.

4
Max

La réponse de @ activedecay semble être la voie à suivre. Cependant, à compter de april 30th 2018, j'ai eu des problèmes avec ce modèle spécifique (le noeud est tombé en panne à cause de la structure de l'objet transmise à .configure, ce qui semble ne pas fonctionner dans la dernière version). Malgré cela, j'ai réussi à contourner une solution mise à jour grâce aux messages de débogage nodejs ...

const myLoggers = require('log4js');

myLoggers.configure({
    appenders: { mylogger: { type:"file", filename: "path_to_file/filename" } },
    categories: { default: { appenders:["mylogger"], level:"ALL" } }
});
const logger = myLoggers.getLogger("default");

Maintenant, si vous voulez vous connecter à ce fichier, vous pouvez le faire comme activedecay vous a montré:

logger.warn('Cheese is quite smelly.');
logger.info('Cheese is Gouda.');
logger.debug('Cheese is not a food.');

Cependant, cela ne connectera rien à la console, et comme je n’ai pas trouvé comment implémenter plusieurs appenders dans un seul enregistreur, vous pouvez toujours implémenter le bon vieux console.log();

PD: Je sais que c'est un fil un peu ancien et que le problème particulier d'OP était déjà résolu, mais puisque je suis venu ici dans le même but, je peux tout aussi bien laisser mon expérience pour aider ceux qui visitent ce fil à l'avenir.

2
J3STER

Il suffit d'écrire votre propre fonction de journal:

function log(message) {
   console.log(message);
   fs.writeFileSync(...);
}

Puis remplacez tous vos appels existants vers console.log() par log().

0
Steve Bennett