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.
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.');
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.
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.
@ 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
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()
.