2013-06-10 10 views
5

Ich führe ständig ein paar Server-Skripte (auf verschiedenen Ports) mit Nodejs für immer.Deaktivieren Sie die Protokollierung in einem node.js-Skript, das für immer ausgeführt wird

Auf einigen dieser Server ist viel Verkehr. Die console.log Befehle, die ich für das Verfolgen von Verbindungsanomalien habe, führen zu aufgeblähten Protokolldateien, die ich nicht die ganze Zeit benötige - nur zum Debuggen. Ich habe die Skripte spät nachts manuell gestoppt, die Dateien abgeschnitten und neu gestartet. Das wird nicht lange dauern, also haben wir uns entschieden, eine Lösung zu finden.

Jemand anderes auf meinem System löschte die Protokolldateien, die ich für jeden der Server ohne mein Wissen eingerichtet hatte. Der Aufruf von forever Liste in der Befehlszeile zeigt, dass die Server-Skripts noch ausgeführt werden, aber jetzt kann ich die Protokolldateien nicht beenden, um zu sehen, wie die Knoten vorgehen.

Die Ausfallzeit der Knoten sollte auf ein absolutes Minimum beschränkt werden, daher zögere ich, die Server bei Tageslicht für mehr als ein paar Minuten anzuhalten. Erste Tests von der Client-Seite scheinen darauf hinzuweisen, dass die Skripts gut funktionieren, aber ich kann nicht 100% ig sicher sein, dass es keine Fehler aufgrund von fehlgeschlagenen Anmeldeversuchen zu einer nicht vorhandenen Datei gibt.

Ich habe ein paar Fragen tatsächlich:

  1. Ist es ok, für immer zu halten, wie diese ausgeführt werden?
  2. Wenn nicht, gibt es eine ordnungsgemäße Möglichkeit, Protokollierung zu deaktivieren? Die github repository scheint zu zeigen, dass immer noch auf eine Standarddatei protokolliert wird, die ich nicht will. Ansonsten schreibe ich einfach einen Cronjob, der regelmäßig Skripte stoppt, Protokolle abschneidet und dann die Skripte neu startet.
  3. Was passiert, wenn ich das Logfile wieder mit etwas wie touch logfile_name.log erstellen, während das Skript noch läuft - wird dies für immer ausflippen oder ist das eine plausible Lösung?

Danke für Ihre Zeit.

+1

+1 für sehr nette Frage. – verybadalloc

+1

Haben Sie darüber nachgedacht, so etwas wie die meisten Protokollierungssysteme zu implementieren? Anstatt console.log direkt aufzurufen, schreiben Sie eine Wrapper-Funktion (oder verwenden Sie eine Bibliothek), mit der Sie nicht nur eine Nachricht, sondern eine Logging-Ebene zuweisen können, und dann, basierend auf Ihrer Konfiguration, nur Ausgabe-Logs von a bestimmte Bedeutung oder größer. Ich würde sagen, das ist die "richtige" Möglichkeit, die Protokollierung zu deaktivieren. –

+0

@Bret Ich arbeite nicht mehr bei dieser Firma, aber das ist es, was ich getan habe - verschiedene Protokollebenen zu erstellen. Die Dateien wurden so klein gehalten, dass das Skript selten gestoppt werden musste, um die Protokolle vor dem Neustart zu löschen. – Cubis

Antwort

1

Es gibt ein raffiniertes Tool, das Ihnen helfen kann, das so genannte Logrotate. Werfen Sie einen Blick here

Besonders die copytruncate Option, es ist sehr nützlich in Ihrem Fall.

2

nach https://github.com/foreverjs/forever, versuchen Sie, -s, um alle zu protokollieren.

forever -s start YOURSCRIPT

Sicher, bevor Sie dies tun, versuchen Sie immer auf dem neuesten Update:

sudo curl -L https://npmjs.com/install.sh | sudo sh

sudo npm update -g.

+1

-s unterdrückt console.logs nicht. –

1

1) Erstellen Sie einfach eine periodische Funktion oder eine Admin-Option, um die Logs für immer zu löschen. Aus dem Handbuch forever cleanlogs

2) Zumindest für Linux. Senden Sie jede Protokolldatei an /dev/null. Jeder Protokolltyp wird durch die Optionen -l-o und -r angegeben.Die -a Option für append log, wird es aufhören zu beschweren über das bereits vorhandene Protokoll.

forever start -a -l /dev/null -o /dev/null -r /dev/null your-server.js 

Vielleicht ist Ihr eigenes Logging-System verwenden, verwende ich log4js, es beschwert sich nicht, wenn ich die Log-Datei löschen, während der Knoten Prozess noch läuft.