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 [„app“]-Loggers überschrieben hat.
Der Standardwert ist natürlich parentSinks: „inherit“. Wenn Sie die Option also nicht angeben, verhält es sich wie zuvor.
Wenn Sie neugierig auf den Hintergrund dieser Funktionserweiterung sind, lesen Sie bitte GitHub-Problem Nr. 15.
In früheren Versionen, wenn Sie sich so angemeldet haben:
logger.info("Hello, { name }!", { name: "Alice" });
Entgegen den Erwartungen wurde 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, auch 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 Hallo, 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 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 jedes Mal umständlich sein, 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 über die Funktionen getDefaultTextFormatter() und getAnsiColorFormatter() verschiedene Formatierungseinstellungen nach Ihren Wünschen anpassen, ohne TextFormatter von Grund auf implementieren zu müssen.
For example, if you want to represent log levels like "warning" as a single uppercase letter W, you can configure it like this:
const myFormatter = getDefaultTextFormatter({ level: "L" });
Or if you want to omit the date and timezone from the timestamp and only show the time, you can configure it like this:
const myFormatter = getDefaultTextFormatter({ timestamp: "time" });
For descriptions of more formatting options, please refer to the related documentation.
If you're curious about the background of this feature addition, please refer to GitHub issue #13.
LogTape 0.6.0 is already available on JSR and npm, so get it now!
deno add @logtape/logtape@0.6.0 # Deno npm add @logtape/logtape@0.6.0 # npm pnpm add @logtape/logtape@0.6.0 # pnpm yarn add @logtape/logtape@0.6.0 # Yarn bun add @logtape/logtape@0.6.0 # Bun
Happy logging!
Das obige ist der detaillierte Inhalt vonLogTape .eleased: Was ist neu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!