Ich entwickle einen REST-fähigen Server in node.js mit Express als Framework und Winston im Moment als Logger-Modul. Dieser Server wird eine große Menge gleichzeitiger Anfragen bearbeiten, und es wäre sehr nützlich für mich, die Protokolleinträge für jede spezifische Anfrage verfolgen zu können, indem ich eine "Anfrage-ID" benutze. Die direkte Lösung besteht lediglich darin, diese ID jedes Mal, wenn ich einen Protokolleintrag machen möchte, als weitere Protokollierungsinformation hinzuzufügen, aber es bedeutet, die 'Anfrage-ID' an jede vom Server verwendete Methode zu übergeben.
Ich würde gerne wissen, ob es ein node.js / javascript-Modul oder eine Technik gibt, die es mir erlauben würde, dies auf einfachere Weise zu tun, ohne die Anfrage-ID für jede spezifische Anfrage herumzutragen.
Sie können req
Objekt verwenden, das mit jeder Anfrage in Express kommt.
Die erste Route, die Sie in Ihrer Anwendung ausführen würden, wäre also:
Und dann können Sie innerhalb von express auf das id
in req
object zugreifen: req.log.id
;
Sie müssen weiterhin einige Daten an Funktionen übergeben, die einige Protokolle erstellen möchten. In der Tat haben Sie möglicherweise Logging-Funktion innerhalb req.log
-Objekt, so dass es garantiert wird, dass die Protokollierung nur passieren wird, wenn es Zugriff auf req.log
Objekt gibt.
Wenn Sie automatisch inkrementieren, können Ihre späteren Log-Analysen Anfragen nicht eindeutig identifizieren, da verschiedene Instanzen kollidierende IDs generieren und ein Neustart der App automatisch ID-Kollisionen verursacht.
Hier ist eine andere mögliche Lösung.
Installieren Sie cuid:
%Vor%Dann in Ihrer Haupt-App-Datei:
%Vor%Jetzt erhalten Sie eine benutzerfreundliche Anforderungs-ID, die wahrscheinlich nicht kollidiert, und Sie können Ihre Anforderungen für Ihre Log-Analyse und Ihr Debugging sogar über mehrere Instanzen und Server-Neustarts hinweg eindeutig identifizieren.
Ich hatte Mühe, nach einer Lösung für dieses Problem zu suchen. Was mir an den hier vorgeschlagenen Lösungen nicht gefallen hat, war, dass sie das req-Objekt unter allen Funktionen des Projekts teilen. Ich habe eine Lösung gefunden, die Ihren Ansatz (Erstellen einer UUID pro Anfrage) und mit einer Bibliothek (Fortsetzungslokaler Speicher), die das Teilen von Namespaces zwischen Modulen ermöglicht, vermischt.
Sie finden die Erklärung in dieser anderen Antwort: Ссылка
Wenn Sie weitere Informationen wünschen, habe ich alle diese Ideen und den gesamten Code in einem Beitrag aufgeschrieben, um alles an einem Ort zu erklären: Express.js: Protokollierungsinformationen mit globaler eindeutiger Anforderungs-ID - Node.js
>Sie sollten keine globalen Variablen verwenden.
Was ich tun möchte, ist ein META-Objekt vor jeder Anfrage aufzufüllen.
Ich verwende einen UUID-Generator ( Ссылка ), um eine Anfrage zu identifizieren
Hier ist ein Beispiel
%Vor%