首頁 > web前端 > js教程 > 主體

LogTape .eleased:有什麼新內容?

Linda Hamilton
發布: 2024-09-24 16:31:43
原創
350 人瀏覽過

LogTape .eleased: What

LogTape,一個用於 JavaScript 和 TypeScript 的零依賴結構化日誌庫,已發布 v0.6.0。發生了什麼變化?

覆蓋父記錄器的接收器

LogTape 的功能之一是透過分層類別繼承接收器。例如,如果您設定兩個記錄器,如下所示:

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"] },
  ],
});
登入後複製

寫入["app"] 記錄器的日誌只會儲存到app.log 文件,但寫入["app", "module"] 記錄器的日誌將同時儲存到app.log 檔案

app.log

檔案並輸出到控制台。這是因為 ["app", "module"] 記錄器繼承了其父類別 ["app"] 的接收器。 但是,有時您可能不希望出現這種行為。從 LogTape 0.6.0 開始,您現在可以
覆寫

父記錄器的接收器。例如,如果您為子記錄器啟用parentSinks:「覆蓋」選項,如下所示:
await configure({
  sinks: { /* omitted; same as above */ },
  loggers: [
    { category: ["app"],           level: "debug", sinks: ["file"] },
    { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" },
  ],
});
登入後複製

寫入["app"]記錄器的日誌只會保存到

app.log

文件,寫入["app", "module"]記錄器的日誌只會輸出到

app.log

檔案控制台。這是因為子記錄器 ["app", "module"] 覆蓋了 ["app"] 記錄器的接收器。

當然,預設值是parentSinks:“繼承”,所以如果你不指定該選項,它將像以前一樣運行。

如果您對新增此功能的背景感到好奇,請參閱 GitHub Issue #15。

允許訊息範本中的佔位符使用前導/尾隨空格
logger.info("Hello, { name }!", { name: "Alice" });
登入後複製
登入後複製

在先前的版本中,如果您這樣登入:

logger.info("Hello, {name}!", { name: "Alice" });
登入後複製
登入後複製

與預期相反,一條日誌Hello, undefined!將會被建立。這是因為佔位符 { name } 包含空格字符,因此它會尋找屬性「 name 」而不是「 name 」。換句話說,您必須像這樣刪除佔位符中的空格:

logger.info("Hello, { name }!", { " name ": "Alice" });
登入後複製

或在實際屬性名稱中加入相同的空格,如下所示:


雖然嚴格來說這並不是一個錯誤,但根據編碼習慣,它是容易出錯的行為。
logger.info("Hello, { name }!", { name: "Alice" });
登入後複製
登入後複製

但是,從LogTape 0.6.0開始,即使佔位符的開頭和結尾有空格,它也會尋找不含空格的屬性名稱。例如,如果您像這樣登入:


正如預期的那樣,日誌是你好,愛麗絲!將被創建。
logger.info("Hello, { name }!", { name: "Alice", " name ": "Bob" });
登入後複製

但是,如果存在完全匹配的屬性(包括空格字元),則會優先考慮。例如,如果您像這樣登入:

你好,鮑伯!將被記錄而不是你好,愛麗絲! 。

如果您想了解此功能新增的背景,請參閱 GitHub Issue #16。

LogRecord.rawMessage 屬性

LogRecord 是一種資料類型,在 LogTape 輸出和格式化之前表示日誌。

雖然 LogRecord.message 屬性已經存在,但該屬性包含訊息範本中的佔位符替換為實際屬性值後的結果。這在大多數情況下已經足夠了,但是當日誌輸出目的地(接收器)是另一個日誌系統時,您可能希望分別輸出原始訊息範本和屬性值,從而允許接收日誌系統用屬性取代訊息範本中的佔位符直接值。
logger.info("Hello, {name}!", { name: "Alice" });
登入後複製
登入後複製

LogTape 0.6.0 中新增的 LogRecord.rawMessage 正是用於此目的的屬性,其中包含訊息範本的原始狀態以及未替換的佔位符。例如,如果您像這樣登入:

LogRecord.message 將包含值 ["Hello, ", "Alice", "!"],LogRecord.rawMessage 將包含值 "Hello, {name}!"。

如果您想了解此功能新增的背景,請參閱 GitHub Issue #17。

可自訂的內建文字格式化程序
export type TextFormatter = (record: LogRecord) => string;
登入後複製

文字格式化程式是一個接口,它決定每個日誌如何在流接收器、文件接收器等中格式化為文字。實際的型別定義非常簡單:

但是,每次直接定義文字格式化程式可能會很麻煩,因此 LogTape 內建了 defaultTextFormatter 和 ansiColorFormatter 供您使用。到目前為止,由於無法進行其他配置,因此您必須按原樣接受預定格式。例如,如果您不喜歡像「警告」這樣的日誌等級輸出為像 WRN 這樣的三個字母縮寫,則必須從頭開始實作 TextFormatter。 但是,從 LogTape 0.6.0 開始,您可以透過 getDefaultTextFormatter() 和 getAnsiColorFormatter() 函數根據自己的喜好自訂各種格式設置,而無需從頭開始實作 TextFormatter。

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.

Get it from JSR and npm

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!

以上是LogTape .eleased:有什麼新內容?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板