Вы можете определить любые строковые уровни в LoggerLevels. Например:
const levels = {
levels: { trace: -1, debug: 0, info: 1, warn: 2, error: 3, fatal: 4 },
level: "info",
};
Проверьте:
writeFile: true передан в контексте вызова или в baseContext.write, если директория существует.Используйте separator в контексте:
await logger.execute("Сообщение", {
context: { level: "info", separator: " | " },
});
const timestampService = new TimestampService();
timestampService.disable();
Или в конструкторе можно сразу выключить:
const timestampService = new TimestampService();
timestampService.turn(false);
Передайте свою функцию форматирования:
const timestampService = new TimestampService({
formatter: (date) =>
date.toLocaleString("ru-RU", { timeZone: "Europe/Moscow" }),
});
По умолчанию TimestampWrapper уже добавляет скобки. Если вы хотите изменить обёртку, создайте свой класс, реализующий WrapperType, или используйте EmptyWrapper для отключения обёртки:
const timestampService = new TimestampService({
wrapper: new EmptyWrapper(),
});
Наследуйте BaseFormatter и реализуйте canFormat и format. Затем подключите через FormatterHandler.
Пример см. в разделе Расширение и кастомизация.
Используйте ErrorFormatter, который автоматически обрабатывает ошибки в стандартном наборе форматтеров. Если вы заменили formatterHandler, добавьте ErrorFormatter в цепочку.
NullableFormatter преобразует их в строки "null" и "undefined". Он также входит в стандартный набор.
При создании логгера укажите userInputSettings:
const logger = new Logger({
// ...
userInputSettings: {
prefix: "Input:",
separator: " ",
},
});
Метод read возвращает пустую строку, если пользователь нажал Enter без ввода. Вы можете проверить это самостоятельно.
let userInput = "";
while (!userInput.trim()) {
userInput = await logger.read("Введите ваше имя (обязательно):", {
context: { level: "info" },
});
if (!userInput.trim()) {
console.log("Имя не может быть пустым. Попробуйте снова.");
}
}
console.log(`Привет, ${userInput}!`);
В Node.js вы можете использовать обработчик события SIGINT. Это не входит в библиотеку, но вы можете обернуть вызов read:
process.on("SIGINT", () => {
console.log("\nВвод прерван");
process.exit();
});
const result = await logger.read("Введите текст:", {
context: { level: "info" },
});
Запись в файл происходит асинхронно через поток в режиме append, что минимизирует блокировку. Однако для высоконагруженных систем рекомендуется использовать отдельный поток или буферизацию.
Нет, библиотека использует Node.js API (fs, process). Для браузера потребуется отдельная адаптация.
Убедитесь, что у процесса есть права на запись в указанную директорию. FileService автоматически создаёт директорию, если её нет, но только если родительская директория существует и доступна для записи.
Метод read блокирует поток ввода до завершения. Если попытаться вызвать его повторно до завершения первого, будет выброшена ошибка. Дождитесь завершения предыдущего вызова.
Укажите name в конструкторе:
const logger = new Logger({
name: "MyApp",
// ...
});
Да, создайте несколько экземпляров с разными конфигурациями.
Вы можете создать свой аффикс, унаследовав BaseAffix с типом suffix:
class MySuffix extends BaseAffix {
public constructor(data: AffixChildConstructor) {
super({ type: "suffix", ...data });
}
}
Затем подключите его в AffixHandler.
Минимальная версия — 7.6.0 (из-за использования async/await и fs/promises). Рекомендуется использовать LTS-версии Node.js.
Да, библиотека написана на TypeScript и поставляется с полной типизацией.
В разделе Быстрый старт и в тестах проекта (если есть).
Да, просто не передавайте fileService в конструктор.
Установите log: false в контексте:
await logger.execute("Секретно", {
context: { level: "info", log: false, writeFile: true },
});
Вы можете передать любой объект в input, если он реализует toString() или если вы добавили кастомный форматтер для его обработки.