2013-04-22 13 views
17

Ich habe einen untergeordneten Prozess, den ich wie folgt in node.js verwende. Anstatt die Ausgabe an die Konsole umzuleiten, möchte ich die Ausgabe in eine Log-Datei schreiben, die sich irgendwo auf der Maschine befindet, auf der sie läuft (und sollte sowohl für Windows als auch für Mac funktionieren).Umleiten der Ausgabe in eine Protokolldatei mit node.js

Der folgende Code ist, was ich verwende, und ich möchte die Dateien in eine Protokolldatei ausgeben. Was ändert sich, um das hier zu tun? Vielen Dank!

Mein Code:

var spawn = require('child_process').spawn, 
    ls = spawn('ls', ['-lh', '/usr']); 

ls.stdout.on('data', function (data) { 
    console.log('stdout: ' + data); 
}); 

ls.stderr.on('data', function (data) { 
    console.log('stderr: ' + data); 
}); 

ls.on('close', function (code) { 
    console.log('child process exited with code ' + code); 
}); 
+1

http://stackoverflow.com/ Fragen/2496710/nodejs-write-to-file Dies wurde vor langer Zeit beantwortet – AberZombie

+0

werfen Sie einen Blick auf diese Antwort http://stackoverflow.com/questions/2496710/nodejs-write-to-file Ich denke, Sie werden einen Weg zu machen tu das alleine. –

Antwort

-6

Die beste Antwort war in den Kommentaren und wird in einer früheren Frage hier erwähnt: stackoverflow.com/questions/2496710/nodejs-write-to-file

Es ist wie folgt:

var fs = require('fs'); 
fs.writeFile("/tmp/test", "Hey there!", function(err) { 
    if(err) { 
     console.log(err); 
    } else { 
     console.log("The file was saved!"); 
    } 
}); 
+2

Ihre Frage bezog sich also nicht so sehr auf 'child_process' und die Ausgabe in eine Logdatei, sondern mehr 'wie schreibe ich in eine Datei in Node.js'? – robertklep

+0

@robertklep yeah, sorry dachte der Titel (Redirecting Ausgabe in eine Protokolldatei mit node.js) war klar :( – user220755

32

Hier ist ein Beispiel für die Anmeldung mit Hilfe von Streams in Datei.

var logStream = fs.createWriteStream('./logFile.log', {flags: 'a'}); 

var spawn = require('child_process').spawn, 
    ls = spawn('ls', ['-lh', '/usr']); 

ls.stdout.pipe(logStream); 
ls.stderr.pipe(logStream); 

ls.on('close', function (code) { 
    console.log('child process exited with code ' + code); 
}); 
+3

createWriteStream ist das Beste für Protokolldateien. Aus der Dokumentation: "Beachten Sie, dass es nicht sicher ist, fs.write mehrfach in derselben Datei zu verwenden, ohne auf den Rückruf zu warten. Für dieses Szenario wird fs.createWriteStream dringend empfohlen." – BaronVonKaneHoffen

+0

Unter Verwendung fast identischen Codes erhalte ich manchmal eine Ausnahme, die ich versuche, in den Stream zu schreiben, nachdem dieser geschlossen wurde. Die Dokumentation sagt "Pipe" wird den Zielstream schließen, wenn der Quelldatenstrom ein "Ende" -Ereignis ausgibt. Kann es sein, dass stderr nur ein kleines bisschen schließt, bevor stdout alle Daten ausgibt? – Stav

0

Wenn Sie Ihr JS-Skript mit forever ausführen, dann haben Sie die Möglichkeit, eine Protokolldatei als Parameter zu definieren, die alle Ihre console.log Nachrichten behandelt. Ganz zu schweigen von dem Vorteil, dass du deine nodejs-App permanent live hältst.

Alternativ versuchen Sie dies:

sudo forever start myapp.js 2>&1 /home/someuser/myapp/myapp.log 
+0

Umleiten Standard-und Fehler-Ausgabe wird nur die ausführliche Ausgabe von für immer, wenn Sie es zu starten. Sie werden nie in der Lage sein Fange die Logs deiner App. –

-1

Gebrauch immer mit folgenden Optionen

immer starten -o out.log-err.log server.js

Verwandte Themen