LogTape, eine strukturierte Protokollierungsbibliothek ohne Abhängigkeiten für JavaScript und TypeScript, hat v0.6.0 veröffentlicht. Was hat sich geändert?
Eine der Funktionen von LogTape ist die Vererbung von Senken durch hierarchische Kategorien. Wenn Sie beispielsweise zwei Logger wie folgt einrichten:
import { configure, getConsoleSink, getFileSink } from "@logtape/logtape"; await configure({ sinks: { console: getConsoleSink(), file: getFileSink("app.log"), }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"] }, ], });
In den Logger ["app"] geschriebene Protokolle werden nur in der Datei app.log gespeichert, in den Logger ["app", "module"] geschriebene Protokolle werden jedoch in beiden gespeichert die Datei app.log und Ausgabe an die Konsole. Dies liegt daran, dass der Logger ["App", "Modul"] die Senken von seiner übergeordneten Kategorie ["App"] erbt.
Aber manchmal möchten Sie dieses Verhalten möglicherweise nicht. Ab LogTape 0.6.0 können Sie jetzt die Senken des übergeordneten Loggers überschreiben. Wenn Sie beispielsweise die Option „parentSinks: „override““ für den untergeordneten Logger wie folgt aktivieren:
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
In den Logger ["app"] geschriebene Protokolle werden nur in der Datei app.log gespeichert, und in den Logger ["app", "module"] geschriebene Protokolle werden nur in ausgegeben die Konsole. Dies liegt daran, dass der untergeordnete Logger [„app“, „module“] die Senken des Loggers [„app“] überschrieben hat.
Der Standardwert ist natürlich parentSinks: „inherit“. Wenn Sie die Option also nicht angeben, verhält sie sich wie zuvor.
Wenn Sie neugierig auf den Hintergrund dieser Funktionserweiterung sind, lesen Sie bitte GitHub-Problem Nr. 15.
Wenn Sie sich in früheren Versionen wie folgt angemeldet haben:
logger.info("Hello, { name }!", { name: "Alice" });
Entgegen den Erwartungen ein Protokoll von Hallo, undefiniert! würde entstehen. Dies lag daran, dass der Platzhalter {name} Leerzeichen enthielt und daher nach einer Eigenschaft „name“ anstelle von „name“ gesucht wurde. Mit anderen Worten, Sie mussten die Leerzeichen entweder wie folgt aus dem Platzhalter entfernen:
logger.info("Hello, {name}!", { name: "Alice" });
Oder fügen Sie die gleichen Leerzeichen wie folgt zum eigentlichen Eigenschaftsnamen hinzu:
logger.info("Hello, { name }!", { " name ": "Alice" });
Obwohl es sich hierbei nicht unbedingt um einen Fehler handelte, handelte es sich um ein fehleranfälliges Verhalten, abhängig von den Programmiergewohnheiten.
Ab LogTape 0.6.0 wird jedoch nach einem Eigenschaftsnamen ohne Leerzeichen gesucht, selbst wenn am Anfang und Ende des Platzhalters Leerzeichen stehen. Wenn Sie sich beispielsweise wie folgt anmelden:
logger.info("Hello, { name }!", { name: "Alice" });
Wie erwartet ein Protokoll von Hello, Alice! wird erstellt.
Wenn es jedoch eine Eigenschaft gibt, die einschließlich der Leerzeichen genau übereinstimmt, wird diese priorisiert. Wenn Sie sich beispielsweise wie folgt anmelden:
logger.info("Hello, { name }!", { name: "Alice", " name ": "Bob" });
Hallo, Bob! wird anstelle von Hello, Alice! protokolliert.
Wenn Sie neugierig auf den Hintergrund dieser Funktionserweiterung sind, lesen Sie bitte GitHub-Problem Nr. 16.
LogRecord ist ein Datentyp, der ein Protokoll darstellt, bevor es von LogTape ausgegeben und formatiert wird.
Während die Eigenschaft „LogRecord.message“ bereits vorhanden war, enthielt diese Eigenschaft das Ergebnis, nachdem die Platzhalter in der Nachrichtenvorlage durch tatsächliche Eigenschaftswerte ersetzt wurden. Dies reichte in den meisten Fällen aus, aber wenn das Protokollausgabeziel (Senke) ein anderes Protokollierungssystem ist, möchten Sie möglicherweise die ursprüngliche Nachrichtenvorlage und die Eigenschaftswerte separat ausgeben, damit das empfangende Protokollierungssystem die Platzhalter in der Nachrichtenvorlage durch Eigenschaften ersetzen kann Werte direkt eingeben.
Die in LogTape 0.6.0 hinzugefügte Eigenschaft LogRecord.rawMessage ist eine Eigenschaft für genau diesen Zweck, die den ursprünglichen Zustand der Nachrichtenvorlage mit nicht ersetzten Platzhaltern enthält. Wenn Sie sich beispielsweise wie folgt anmelden:
logger.info("Hello, {name}!", { name: "Alice" });
Während LogRecord.message den Wert ["Hallo, ", "Alice", "!"] enthält, enthält LogRecord.rawMessage den Wert "Hallo, {Name}!".
Wenn Sie neugierig auf den Hintergrund dieser Funktionserweiterung sind, lesen Sie bitte GitHub-Problem Nr. 17.
Ein Textformatierer ist eine Schnittstelle, die bestimmt, wie jedes Protokoll in Stream-Senken, Datei-Senken usw. in Text formatiert wird. Die eigentliche Typdefinition ist recht einfach:
export type TextFormatter = (record: LogRecord) => string;
Es kann jedoch umständlich sein, jedes Mal einen Textformatierer direkt zu definieren, daher verfügt LogTape über integrierte defaultTextFormatter und ansiColorFormatter, die Sie verwenden können. Da bisher keine zusätzliche Konfiguration möglich war, musste man das vorgegebene Format so übernehmen, wie es ist. Wenn Ihnen beispielsweise nicht gefiel, dass Protokollebenen wie „Warnung“ als dreibuchstabige Abkürzungen wie WRN ausgegeben wurden, mussten Sie TextFormatter von Grund auf implementieren.
Ab LogTape 0.6.0 können Sie jedoch verschiedene Formatierungseinstellungen über die Funktionen getDefaultTextFormatter() und getAnsiColorFormatter() nach Ihren Wünschen anpassen, ohne TextFormatter von Grund auf implementieren zu müssen.
Wenn Sie beispielsweise Protokollebenen wie „Warnung“ als einzelnen Großbuchstaben W darstellen möchten, können Sie dies wie folgt konfigurieren:
const myFormatter = getDefaultTextFormatter({ level: "L" });
Oder wenn Sie das Datum und die Zeitzone aus dem Zeitstempel weglassen und nur die Uhrzeit anzeigen möchten, können Sie es wie folgt konfigurieren:
const myFormatter = getDefaultTextFormatter({ timestamp: "time" });
Beschreibungen weiterer Formatierungsoptionen finden Sie in der entsprechenden Dokumentation.
Wenn Sie neugierig auf den Hintergrund dieser Funktionserweiterung sind, lesen Sie bitte GitHub-Problem Nr. 13.
LogTape 0.6.0 ist bereits auf JSR und npm verfügbar, also holen Sie es sich jetzt!
deno add @logtape/[email protected] # Deno npm add @logtape/[email protected] # npm pnpm add @logtape/[email protected] # pnpm yarn add @logtape/[email protected] # Yarn bun add @logtape/[email protected] # Bun
Viel Spaß beim Loggen!
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3