wake-up-neo.com

Node.js console.log () in der txt-Datei

Ich habe eine andere Frage ( letzte Frage ). Im Moment arbeite ich an einem Node.js-Projekt und darin habe ich viele console.log () -Funktionen. Dies hat bisher in Ordnung geklappt, aber ich möchte auch, dass alles, was in die Konsole geschrieben wurde, also in eine Protokolldatei geschrieben wird. Kann mir bitte jemand helfen?

Zum Beispiel:

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

In meinem eigentlichen Code ist es ein bisschen mehr, aber dies sollte Ihnen eine Idee geben.

Ich danke Ihnen hoffentlich.

15
Limatuz

Ich würde eine Bibliothek verwenden, anstatt das Rad neu zu erfinden. Ich habe nach einer log4j- Typbibliothek auf npm gesucht, und es kam mit https://github.com/nomiddlename/log4js-node

wenn Sie sich an der Konsole und in einer Datei anmelden möchten:

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

jetzt kann Ihr Code einen neuen Logger erstellen

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

und verwenden Sie den Logger in Ihrem Code

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

Führen Sie einfach das Skript in Ihrem Terminal so aus ...

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

Dadurch wird die Shell angewiesen, die Standardausgabe des Befehls node script-file.js in Ihre Protokolldatei zu schreiben, anstatt sie in die Standarddatei zu schreiben.

Dies wird als Weiterleitung und sehr mächtig bezeichnet. Angenommen, Sie wollten alle Fehler in eine separate Datei schreiben ...

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

Nun werden alle console.log in log-file.txt geschrieben und alle console.error werden in error-file.txt geschrieben.

28
Charlie Martin

Sie können versuchen, das eingebaute console.log etwas anderes machen.

var originalLog = console.log;

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

Hierdurch wird jedoch originalLog in den Hauptbereich eingefügt, sodass Sie versuchen sollten, es in eine Funktion einzufügen. Dies nennt man einen Abschluss, und Sie können mehr darüber lesen hier .

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

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

Informationen zum Schreiben von Dateien finden Sie unter this stackoverflow question und zum Überschreiben von console.log noch besser als ich gezeigt habe, siehe this . Wenn Sie diese beiden Antworten kombinieren, erhalten Sie die bestmögliche Lösung.

4
Max

@ Activedecays Antwort scheint der richtige Weg zu sein. Seit april 30th 2018 hatte ich jedoch Probleme mit diesem spezifischen Modell (der Knoten stürzte aufgrund der Struktur des Objekts ab, das an .configure übergeben wurde, was in der neuesten Version nicht zu funktionieren scheint). Trotzdem habe ich es geschafft, eine aktualisierte Lösung zu umgehen, dank nodejs Debugging-Nachrichten ...

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");

Wenn Sie sich nun in die Datei einloggen möchten, können Sie dies genauso tun wie activedecay Ihnen gezeigt hat:

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

Dies protokolliert jedoch nichts auf der Konsole, und da ich noch nicht herausgefunden habe, wie Sie mehrere Appender in einem Logger implementieren, können Sie immer noch die gute alte console.log(); implementieren.

PD: Ich weiß, dass dies ein etwas alter Thread ist, und dass das spezielle Problem von OP bereits gelöst wurde. Da ich aber aus demselben Grund hierher gekommen bin, kann ich meine Erfahrung genauso gut hinterlassen, um jedem zu helfen, der diesen Thread in Zukunft besucht

2
J3STER

Schreiben Sie einfach Ihre eigene Protokollfunktion:

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

Ersetzen Sie dann alle Ihre bestehenden Anrufe für console.log() durch log().

0
Steve Bennett