Ich habe ein vollständiges, bereitgestelltes Express-basiertes Projekt mit vielen Anweisungen für console.log () und console.error (). Das Projekt wird für immer ausgeführt und leitet stdout und stderr in zwei separate Dateien.
Es funktioniert alles ganz gut, aber jetzt fehlen mir Zeitstempel - um genau zu wissen, wann Fehler aufgetreten sind.
Ich kann im gesamten Code suchen / ersetzen oder ein npm-Modul verwenden, das die Konsole in jeder Datei überschreibt, aber ich möchte nicht jede Modell- / Routendatei berühren, es sei denn, ich muss dies unbedingt tun.
Gibt es eine Möglichkeit, vielleicht eine Express-Middleware, mit der ich jedem getätigten Anruf einen Zeitstempel hinzufügen kann, oder muss ich ihn manuell hinzufügen?
Antworten:
Es stellt sich heraus, Sie können die Funktionen der Konsole an der Spitze der app.js Datei außer Kraft setzen, und haben sie Wirkung in jedem anderen Modul nehmen. Ich habe gemischte Ergebnisse erhalten, weil eines meiner Module als
child_process
. Sobald ich die Zeile auch an den Anfang dieser Datei kopiert habe, funktioniert alles.Für den Datensatz habe ich das Modul console-stamp (
npm install console-stamp --save
) installiert und diese Zeile oben in app.js und childProcess.js eingefügt:Mein Problem war jetzt, dass das
:date
Format des Verbindungsloggers das UTC-Format verwendet und nicht das, das ich in den anderen Konsolenaufrufen verwende. Dies konnte leicht behoben werden, indem ich mein eigenes Zeitformat registrierte (und als Nebeneffekt das mitgeliefertedateformat
Modul benötigteconsole stamp
, anstatt ein anderes zu installieren):Jetzt sehen meine Protokolldateien organisiert aus (und noch besser, analysierbar):
quelle
logger
wurde durchmorgan
github.com/senchalabs/connect#middlewareModul: "Log-Timestamp" funktioniert bei mir.
Siehe https://www.npmjs.com/package/log-timestamp
Einfach zu benutzen
Ergebnis
quelle
Erstellen Sie eine Datei mit den folgenden Angaben:
Fordern Sie es in Ihrer App an, bevor Sie etwas protokollieren. Machen Sie dasselbe
console.error
bei Bedarf.Beachten Sie, dass diese Lösung das Einfügen von Variablen (
console.log("he%s", "y") // "hey"
) zerstört, wenn Sie diese verwenden. Wenn Sie das brauchen, protokollieren Sie einfach zuerst den Zeitstempel:quelle
Wenn Sie eine Lösung ohne eine andere externe Abhängigkeit wünschen, aber die vollen Funktionen von console.log (mehrere Parameter, Einfügen von Variablen) beibehalten möchten, können Sie den folgenden Code verwenden:
Sie können die Funktion formatConsoleDate ändern, um das gewünschte Datum zu formatieren.
Dieser Code muss nur einmal über Ihre JavaScript-Hauptdatei geschrieben werden.
console.log("he%s", "y")
druckt so etwas:quelle
Sie können auch das Paket log-timestamp verwenden . Es ist ganz einfach und auch anpassbar.
quelle
quelle
Diese Implementierung ist einfach, unterstützt die ursprüngliche Funktionalität von console.log (Übergeben eines einzelnen Objekts und Ersetzen von Variablen), verwendet keine externen Module und druckt alles in einem einzigen Aufruf von console.log:
quelle
Dies ist keine direkte Antwort, aber haben Sie sich mit winston.js befasst? Es verfügt über eine Menge weiterer Protokollierungsoptionen, einschließlich der Protokollierung in einer JSON-Datei oder -Datenbank. Diese haben standardmäßig immer Zeitstempel. Nur ein Gedanke.
quelle
Sie können eine Funktion
util.log
von https://nodejs.org/api/util.html verwenden .Beachten Sie, dass es seit Version 6.0.0 veraltet ist.
Für höhere Versionen sollten Sie "stattdessen ein Modul eines Drittanbieters verwenden".
quelle
Wenn Sie möchten, können Sie einen benutzerdefinierten Logger für Ihre Anwendung erstellen, indem Sie die Build-in-Klasse "Console" des Knotens erweitern. Bitte beziehen Sie sich auf die folgende Implementierung
Danach können Sie es in Ihrem Code verwenden als:
quelle
Ich versuche das zu überschreiben
console
Objekt zu - scheint gut zu funktionieren. Speichern Sie zur Verwendung den folgenden Code in einer Datei, importieren Sie ihn, um das Proxy-Objekt zu überschreiben, und verwenden Sie ihn dann wie gewohnt.(Beachten Sie, dass dies eine Babel-Transpilation erfordert und in Umgebungen, die den JavaScript-
Proxy
Konstruktor nicht unterstützen, wie z. B. IE 11, nicht funktioniert .)Grundsätzlich überschreibe ich das Konsolenobjekt mit einem JavaScript-Proxy-Objekt. Wenn Sie usw. aufrufen
.log
,.warn
prüft die überschriebene Konsole, ob das, was Sie aufrufen, eine Funktion ist. In diesem Fall wird als erster Parameter ein Datum in die Protokollanweisung eingefügt, gefolgt von allen Ihren Parametern.Ich denke, das
console
Objekt macht tatsächlich viel und ich verstehe es nicht ganz. Also habe ich nur abfangenconsole.log
,console.info
,console.warn
,console.error
nennt.quelle
Verwenden Sie den Ereignis-Listener wie folgt:
Happy Coding :)
quelle