LogTape, библиотека структурированного журналирования с нулевой зависимостью для JavaScript и TypeScript, выпустила версию 0.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", "module"] наследует приемники из своей родительской категории ["app"].
Однако иногда такое поведение может быть нежелательно. Начиная с LogTape 0.6.0, теперь вы можете переопределить приемники родительского регистратора. Например, если вы включите опцию «parentSinks: override» для дочернего регистратора следующим образом:
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", "module"] переопределил приемники регистратора ["app"].
Конечно, значением по умолчанию является родительскийSinks: «наследовать», поэтому, если вы не укажете этот параметр, он будет вести себя как раньше.
Если вам интересно узнать об этом добавлении функции, обратитесь к выпуску GitHub № 15.
В предыдущих версиях, если вы входили в систему следующим образом:
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" });
Как и ожидалось, лог Hello, Alice! будет создан.
Однако, если есть свойство, которое точно соответствует, включая пробельные символы, оно будет иметь приоритет. Например, если вы входите в систему следующим образом:
logger.info("Hello, { name }!", { name: "Alice", " name ": "Bob" });
Привет, Боб! будет записано вместо «Привет, Алиса!».
Если вам интересно узнать об этом добавлении функции, обратитесь к выпуску GitHub № 16.
LogRecord — это тип данных, который представляет журнал перед его выводом и форматированием с помощью LogTape.
Хотя свойство LogRecord.message уже существовало, оно содержало результат после замены заполнителей в шаблоне сообщения фактическими значениями свойств. В большинстве случаев этого было достаточно, но когда местом назначения вывода журнала (приемником) является другая система журналирования, вы можете захотеть выводить исходный шаблон сообщения и значения свойств отдельно, позволяя принимающей системе журналирования заменять заполнители в шаблоне сообщения свойством. значения напрямую.
LogRecord.rawMessage, добавленный в LogTape 0.6.0, является свойством именно для этой цели и содержит исходное состояние шаблона сообщения с незамещенными заполнителями. Например, если вы входите в систему следующим образом:
logger.info("Hello, {name}!", { name: "Alice" });
Хотя LogRecord.message будет содержать значение ["Hello, ", "Alice", "!"], LogRecord.rawMessage будет содержать значение "Hello, {name}!".
Если вам интересно узнать об этом добавлении функции, обратитесь к выпуску GitHub № 17.
Форматировщик текста — это интерфейс, который определяет, как каждый журнал будет отформатирован в текст в потоковых приемниках, файловых приемниках и т. д. Фактическое определение типа довольно просто:
export type TextFormatter = (record: LogRecord) => string;
Однако каждый раз напрямую определять форматировщик текста может быть затруднительно, поэтому в LogTape есть встроенные defaultTextFormatter и ansiColorFormatter, которые вы можете использовать. До сих пор, поскольку дополнительная настройка была невозможна, вам приходилось принимать предопределенный формат как есть. Например, если вам не понравилось, что уровни журнала, такие как «предупреждение», выводятся в виде трехбуквенных сокращений, таких как WRN, вам пришлось реализовать TextFormatter с нуля.
Однако, начиная с LogTape 0.6.0, вы можете настроить различные параметры форматирования по своему вкусу с помощью функций getDefaultTextFormatter() и getAnsiColorFormatter() без необходимости реализации TextFormatter с нуля.
Например, если вы хотите представлять уровни журнала, такие как «предупреждение», в виде одной заглавной буквы W, вы можете настроить это следующим образом:
const myFormatter = getDefaultTextFormatter({ level: "L" });
Или, если вы хотите исключить дату и часовой пояс из отметки времени и показывать только время, вы можете настроить это следующим образом:
const myFormatter = getDefaultTextFormatter({ timestamp: "time" });
Описание дополнительных параметров форматирования можно найти в соответствующей документации.
Если вам интересно узнать об этом добавлении функции, обратитесь к выпуску GitHub № 13.
LogTape 0.6.0 уже доступен на JSR и npm, так что скачайте его прямо сейчас!
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
Удачной регистрации!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3