Ich freue mich, die Veröffentlichung von LogTape 0.7.0 bekannt zu geben, das implizite Kontexte einführt – eine leistungsstarke neue Funktion, die es einfacher denn je macht, kontextbezogene Informationen zu Ihren Protokollen hinzuzufügen gesamte Anwendung.
Stellen Sie sich vor, Sie bearbeiten eine HTTP-Anfrage in Ihrer Anwendung. Sie möchten, dass jede während der Anforderungsverarbeitung generierte Protokollnachricht die Anforderungs-ID enthält, unabhängig davon, wo in Ihrer Codebasis das Protokoll erstellt wird. Vor impliziten Kontexten müssten Sie Folgendes tun:
Mit impliziten Kontexten können Sie jetzt den Kontext am Anfang Ihres Anforderungshandlers festlegen, und jede Protokollnachricht in diesem Ausführungskontext enthält diese Informationen automatisch. Hier ist ein einfaches Beispiel:
function handleRequest(requestId: string) { withContext({ requestId }, () => { // Any log message in this function or any function it calls // will automatically include the requestId processRequest(); }); } function processRequest() { // Note that we don't need to pass the requestId explicitly getLogger("processor").info( "Processing request: {requestId}" ); }
Implizite Kontexte nutzen die kontextlokalen Speichermechanismen der zugrunde liegenden Laufzeit (wie AsyncLocalStorage von Node.js), um Kontextinformationen während der gesamten Ausführung Ihres Codes beizubehalten. Dies bedeutet, dass der Kontext auch bei asynchronen Vorgängen ordnungsgemäß beibehalten wird.
Um implizite Kontexte in Ihrer Anwendung zu ermöglichen, müssen Sie LogTape mit einem kontextlokalen Speicher konfigurieren:
import { AsyncLocalStorage } from "node:async_hooks"; import { configure } from "@logtape/logtape"; await configure({ // ... other settings ... contextLocalStorage: new AsyncLocalStorage(), });
Eine der leistungsstarken Eigenschaften impliziter Kontexte besteht darin, dass sie verschachtelt werden können. Wenn Sie Kontexte verschachteln, erbt der innere Kontext Werte vom äußeren Kontext und kann diese überschreiben:
function handleRequest(requestId: string) { withContext({ requestId, stage: "request" }, () => { // stage is "request" here processUser(1234); }); } function processUser(userId: number) { withContext({ userId, stage: "user" }, () => { // stage is "user" here, but requestId is still available getLogger("processor").info( "Processing user: {userId} for request: {requestId}" ); }); }
Wenn es um die Auflösung von Kontextwerten geht, folgt LogTape einer klaren Prioritätenreihenfolge:
Ab Oktober 2024 werden implizite Kontexte unterstützt in:
Webbrowser unterstützen noch keine impliziten Kontexte, da sie auf die Implementierung des TC39-Async-Context-Vorschlags warten.
Implizite Kontexte sind besonders wertvoll für:
Berücksichtigen Sie bei der Verwendung impliziter Kontexte die folgenden Best Practices:
Wenn Sie LogTape bereits verwenden, ist das Upgrade auf die Verwendung impliziter Kontexte unkompliziert:
Implizite Kontexte in LogTape 0.7.0 bieten eine leistungsstarke Möglichkeit, kontextbezogene Informationen zu Ihren Protokollen hinzuzufügen, ohne Ihren Code zu überladen oder den Kontext manuell durch Ihren Aufrufstapel zu leiten. Sie sind besonders wertvoll in Webdiensten, APIs und anderen Anwendungen, bei denen es wichtig ist, den Kontext über alle Vorgänge hinweg zu verfolgen.
Ich bin gespannt, wie Sie diese Funktion nutzen werden, um die Protokollierung und Beobachtbarkeit Ihrer Anwendung zu verbessern. Probieren Sie es aus und teilen Sie mir Ihre Meinung mit!
Weitere Informationen finden Sie in der vollständigen Dokumentation zu impliziten Kontexten.
Das obige ist der detaillierte Inhalt vonEinführung impliziter Kontexte in LogTape .0. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!