"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > LogTape .eleased: ¿Qué hay de nuevo?

LogTape .eleased: ¿Qué hay de nuevo?

Publicado el 2024-11-13
Navegar:360

LogTape .eleased: What

LogTape, una biblioteca de registro estructurada sin dependencia para JavaScript y TypeScript, ha lanzado la versión 0.6.0. ¿Qué ha cambiado?

Anulación de los receptores del registrador principal

Una de las características de LogTape es la herencia de receptores a través de categorías jerárquicas. Por ejemplo, si configura dos registradores como este:

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"] },
  ],
});

Los registros escritos en el registrador ["app"] solo se guardarán en el archivo app.log, pero los registros escritos en el registrador ["app", "module"] se guardarán en ambos el archivo app.log y envíelo a la consola. Esto se debe a que el registrador ["app", "module"] hereda los receptores de su categoría principal ["app"].

Sin embargo, a veces es posible que no desees este comportamiento. A partir de LogTape 0.6.0, ahora puede anular los receptores del registrador principal. Por ejemplo, si habilita la opción parentSinks: "anular" para el registrador secundario de esta manera:

await configure({
  sinks: { /* omitted; same as above */ },
  loggers: [
    { category: ["app"],           level: "debug", sinks: ["file"] },
    { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" },
  ],
});

Los registros escritos en el registrador ["app"] solo se guardarán en el archivo app.log, y los registros escritos en el registrador ["app", "module"] solo se enviarán a la consola. Esto se debe a que el registrador secundario ["app", "module"] ha anulado los receptores del registrador ["app"].

Por supuesto, el valor predeterminado es parentSinks: "heredar", por lo que si no especificas la opción, se comportará como antes.

Si tienes curiosidad sobre los antecedentes de esta incorporación de funciones, consulta el número 15 de GitHub.

Permitir espacios iniciales/finales para marcadores de posición en plantillas de mensajes

En versiones anteriores, si iniciaste sesión así:

logger.info("Hello, { name }!", { name: "Alice" });

Contrariamente a lo esperado, un registro de ¡Hola, indefinido! se crearía. Esto se debió a que el marcador de posición {nombre} incluía caracteres de espacio, por lo que buscó una propiedad "nombre" en lugar de "nombre". En otras palabras, tenías que eliminar los espacios del marcador de posición de esta manera:

logger.info("Hello, {name}!", { name: "Alice" });

O agregue los mismos espacios al nombre de la propiedad real de esta manera:

logger.info("Hello, { name }!", { " name ": "Alice" });

Si bien esto no fue estrictamente un error, fue un comportamiento propenso a errores dependiendo de los hábitos de codificación.

Sin embargo, a partir de LogTape 0.6.0, incluso si hay espacios al principio y al final del marcador de posición, buscará un nombre de propiedad sin espacios. Por ejemplo, si inicia sesión así:

logger.info("Hello, { name }!", { name: "Alice" });

Como era de esperar, un registro de ¡Hola, Alice! se creará.

Sin embargo, si hay una propiedad que coincide exactamente, incluidos los caracteres de espacio, se le dará prioridad. Por ejemplo, si inicia sesión así:

logger.info("Hello, { name }!", { name: "Alice", " name ": "Bob" });

¡Hola, Bob! se registrará en lugar de ¡Hola, Alice!.

Si tienes curiosidad sobre los antecedentes de esta incorporación de funciones, consulta el número 16 de GitHub.

Propiedad LogRecord.rawMessage

LogRecord es un tipo de datos que representa un registro antes de que LogTape lo genere y lo formatee.

Si bien la propiedad LogRecord.message ya existía, esta propiedad contenía el resultado después de que los marcadores de posición en la plantilla de mensaje se reemplazaran con valores de propiedad reales. Esto fue suficiente en la mayoría de los casos, pero cuando el destino de salida del registro (receptor) es otro sistema de registro, es posible que desee generar la plantilla de mensaje original y los valores de propiedad por separado, permitiendo que el sistema de registro receptor reemplace los marcadores de posición en la plantilla de mensaje con propiedad. valores directamente.

El LogRecord.rawMessage agregado en LogTape 0.6.0 es una propiedad exactamente para este propósito, que contiene el estado original de la plantilla de mensaje con marcadores de posición sin reemplazar. Por ejemplo, si inicia sesión así:

logger.info("Hello, {name}!", { name: "Alice" });

Mientras LogRecord.message contendrá el valor ["Hola, ", "Alice", "!"], LogRecord.rawMessage contendrá el valor "¡Hola, {nombre}!".

Si tienes curiosidad sobre los antecedentes de esta incorporación de funciones, consulta el número 17 de GitHub.

Formateadores de texto integrados personalizables

Un formateador de texto es una interfaz que determina cómo se formateará cada registro en texto en receptores de flujo, receptores de archivos, etc. La definición de tipo real es bastante simple:

export type TextFormatter = (record: LogRecord) => string;

Sin embargo, puede resultar engorroso definir un formateador de texto directamente cada vez, por lo que LogTape tiene defaultTextFormatter y ansiColorFormatter integrados que puede usar. Hasta ahora, como no era posible ninguna configuración adicional, había que aceptar el formato predeterminado tal cual. Por ejemplo, si no le gustaba que los niveles de registro como "advertencia" se mostraran como abreviaturas de tres letras como WRN, tenía que implementar TextFormatter desde cero.

Sin embargo, a partir de LogTape 0.6.0, puedes personalizar varias configuraciones de formato a tu gusto a través de las funciones getDefaultTextFormatter() y getAnsiColorFormatter() sin tener que implementar TextFormatter desde cero.

Por ejemplo, si desea representar niveles de registro como "advertencia" como una única letra W mayúscula, puede configurarlo así:

const myFormatter = getDefaultTextFormatter({ level: "L" });

O si deseas omitir la fecha y la zona horaria de la marca de tiempo y solo mostrar la hora, puedes configurarlo así:

const myFormatter = getDefaultTextFormatter({ timestamp: "time" });

Para obtener descripciones de más opciones de formato, consulte la documentación relacionada.

Si tienes curiosidad sobre los antecedentes de esta incorporación de funciones, consulta el número 13 de GitHub.

Consíguelo de JSR y npm

LogTape 0.6.0 ya está disponible en JSR y npm, ¡así que consíguelo ahora!

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

¡Feliz inicio de sesión!

Declaración de liberación Este artículo se reproduce en: https://dev.to/hongminhee/logtape-060-released-whats-new-17od?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3