Ich benutze express.js. Ich muss in der Lage sein, bestimmte Anfragedaten zu protokollieren, wenn jemand versucht, eine Nachricht zu protokollieren. Dazu möchte ich eine Hilfsmethode wie diese erstellen
%Vor%Ich würde dann die Methode so verwenden.
%Vor%Beachten Sie, dass ich das req-Objekt nicht an die log_message-Funktion übergebe. Ich möchte, dass dies transparent gemacht wird, damit der log_message-API-Benutzer die gemeinsamen Daten, die protokolliert werden, nicht kennen muss.
Gibt es eine Möglichkeit, dies mit express.js / node.js zu erreichen? Ist das Anfrageobjekt von einer globalen Variablen verfügbar?
Die folgende Lösung ist für mich akzeptabel.
Hier habe ich eine Middleware, die dem Request-Objekt die Methode log_message hinzufügt. Danach rufe ich req.log_message einfach auf, um die Nachricht zu protokollieren. Das ist sehr ähnlich, wenn man das req-Objekt an jeden Logging-Aufruf weitergibt, aber es ist nur etwas sauberer.
%Vor%Eine interessante Möglichkeit wäre das neue Domänen-Feature. Ссылка
Domains können zwar eine ausgezeichnete Fehlerbehebungsfunktion bieten, können jedoch als eine Art "lokaler Thread-Speicher" verwendet werden - im Grunde genommen werden Daten für jede Anfrage gespeichert.
Erstellen Sie eine Middleware, die jede Anforderung / Antwort zu einer Domäne hinzufügt.
%Vor%In der Protokollfunktion können Sie jetzt die aktuelle Domäne abrufen und das Anforderungsobjekt herausziehen.
%Vor%Domains sind immer noch experimentell, aber es hört sich nicht so an, als würde sich zwischen jetzt und der Version 1.0 viel ändern.
Ähnlich wie bei der Domain-Antwort, ist es nun wesentlich einfacher, dies mit dem Fortfahren-Local-Storage zu tun: Ссылка
Bei DataHero speichern wir eine Transaktions-ID, eine Benutzer-ID und eine Sitzungs-ID mit allen Protokollnachrichten. Sie müssen das Anforderungsobjekt nicht vollständig übergeben, damit es auch Ihre Modelle / Business-Ebene sauber hält.
Wie ist die log_message
für den Aufrufer (ein Modul usw.) verfügbar und welche Kontrolle haben Sie über die Pipeline vor der Route?
Sie könnten Middleware vor dem Aufruf dieser Route anwenden und die Funktion log_message
von einer Closure kommen lassen, oder Sie könnten die Funktion req
EventEmitter nutzen und den Aufruf in winston.log innerhalb eines Handlers für die req umbrechen .end und protokollieren Sie alle Nachrichten, die während der Anfrage erstellt wurden. Dies würde Ihr log_message
effektiv zu einem Akkumulator von Protokollnachrichten (möglicherweise in einem Array) ändern und sie alle am Ende der Anforderung protokollieren.
Das kommt darauf an, wie Sie dieses Zeug bloßlegen.
Viele Katzen wurden hier gehäutet:)
Tags und Links javascript node.js express