scrapy-logger v0.2.1
Scrapy logger
English | Русский
Это простенький логер. Сейчас существует очень много разных логеров, но все они тусклые. Периодически я занимаюсь веб-скрапингом. Так или иначе, но я в консоли провожу достаточно много времени, и мне бы хотелось нормально видеть данные которые я собираю. Вторая причина, все логеры которые я видел не настраивались так, как мне хотелось. Они или отображали время, или не отображали его. Мало какие логеры имеют группировку, ты собираешь данные со страницы, выводишь их, и собранная информация со страницы у тебя сливается, что не удобно. Хотелось бы как-то различать собранные данные. Данная библиотека предназначена для работы в терминале, и использовать её в браузере не получится. Для работы данного логера нужен "node.js" 18 версии или выше (у меня стоит версия 18.18.0).
Установка
Для установки логера нужно набрать в консоли:
npm install --save-dev scrapy-logger
Подключение логера осуществляется следующим способом:
import logger from 'scrapy-logger';
Естественно, что в "package.json" нужно добавить следующую строчку:
"type": "module",
Если вы предпочитаете "сommonJS" модули, то тогда моя библиотека подключается следующим способом:
const logger = require('scrapy-logger/lib/cjs/scrapy-logger.cjs');
Основные методы
Для того, чтобы понять как работает логер, достаточно посмотреть следующий код. Описание основных команд находится ниже:
logger.type('Какое-то сообщение')
Типовое сообщение, цвет сообщения будет белым.
logger.info('Какое-то сообщение')
Пример информационного сообщения, цвет будет ярко-синим.
logger.mes('Какое-то сообщение')
Пример простого сообщения, его цвет будет яркий магента.
logger.success('Какое-то сообщение')
Пример успешного сообщения, его цвет будет ярко-зелёным.
logger.warn('Какое-то сообщение')
Пример предупреждения, его цвет будет якро-жёлтым.
logger.error('Какое-то сообщение')
Пример сообщения об ошибки, его цвет будет ярко красным.
Очень часто возникает такая ситуация, что одно сообщение нужно ярче выделить, чем все остальные. Первоначально, для того, чтобы выделить фоном одно сообщения, я делал так:
// Включаю background
logger.enableBg()
.success('Какое-то сообщение')
.disableBg();
// Отключаю его
Естественно, что это не удобно, в итоге я пришёл к выводу, что проще написать соответствующие методы для этого.
logger.typeBg('Пример типового сообщения');
Типовое сообщение, background будет белым.
logger.infoBg('Пример информационного сообщения');
Пример информационного сообщения, background будет ярко-синим.
logger.mesBg('Пример простого сообщения');
Пример простого сообщения, его background будет яркий магента.
logger.successBg('Пример успешного сообщения');
Пример успешного сообщения, его background будет ярко-зелёным.
logger.warnBg('Пример предупреждения');
Пример предупреждения, его background будет якро-жёлтым.
logger.errorBg('Пример ошибки');
Пример сообщения об ошибки, его background будет ярко красным.
Обычно, когда все данные собраны, нужно отобразить в консоли статистику по этим данным. Как правило статистика по этим данным отображается без времени. Раньше я отключал, а потом включал время следующим способом:
// Отключаю отображение временного интервала
logger.disableTimePeriod();
logger.success('Какое-то сообщение');
logger.enableTimePeriod()
// Включаю отображение временного интервала
Как не трудно догадаться, это не удобно, поэтому я написал для этоо соответствующие методы:
logger.typeNoTime('Пример типового сообщения');
Типовое сообщение без временного периода, его цвет будет белым.
logger.infoNoTime('Пример информационного сообщения');
Пример информационного сообщения без временного периода, его цвет будет ярко-синим.
logger.mesNoTime('Пример простого сообщения');
Пример простого сообщения без временного периода, его цвет будет яркий магента.
logger.successNoTime('Пример успешного сообщения');
Пример успешного сообщения без временного периода, его цвет будет ярко-зелёным.
logger.warnNoTime('Пример предупреждения');
Пример предупреждения без временного периода, его цвет будет ярко-жёлтым.
logger.errorNoTime('Пример ошибки');
Пример сообщения об ошибки без временного периода, его цвет будет ярко красным.
Точная настройка
По умолчаню логер отображает дату в следующем формате:
20:20:56 26.02.25
Для того, чтобы отображать год полностью, нужно:
logger.enableFullYear();
Сообщения в таком случае будут выглядеть так:
20:20:56 26.02.2025
Для того, чтобы отображать сообщения как раньше, нужно:
logger.disableFullYear();
Есть некоторые задачи, для которых нет смысла отображать дату, к примеру, мы точно знаем, что она закончится за несколько часов. Для отключения даты нужно:
logger.disableDate();
Если же мы снова хотим её включить, то нужно:
logger.enableDate();
Логично, что если возможно отключать, или включать дату, то нужно иметь возможность включать, или отключать время. Для отключения времени нужно:
logger.disableTime();
Для включения времени, нужно:
logger.enableTime();
Если нам нужно полностью отключить и время и дату, то нужно:
logger.disableTimePeriod();
Для включения времени и даты, нужно:
logger.enableTimePeriod();
Если мы хотим, чтобы все наши сообщения были с подсветкой, то нужно ввести:
logger.enableBg();
Если нам нужно отключить подсветку сообщений, то нужно:
logger.disableBg();
Методы группировки
Если мы собираем постраничную информацию, то при ее выводе в терминале, она сливается, имеет смысл ее сгруппировать. Это делается следующим способом.
logger.group('Заголовок для группы');
logger.type('Пример типового сообщения');
logger.info('Пример информационного сообщения');
logger.mes('Пример простого сообщения');
logger.success('Пример успешного сообщения');
logger.warn('Пример предупреждения');
logger.error('Пример ошибки');
logger.endGroup();
Началом для группировки сообщений слушит метод "logger.group", а концом служит метод "logger.endGroup()". Всё, что находится между этими методами, будет отображаться в терминале с небольшим отступом.
Если нам нужно добавить отступ между группами, то для этого служит следующим метод:
logger.space();
Этот метода добавляет пустую строку в терминале.
Вывод сообщений в одну строку.
Некторорым людям не нравится отображать всю информацию в терминале. К примеру мы собираем информацию, с сайта, там около 1000 страниц, и нет смысла выводить всю информацию. Имеет смысл вывести информацию только с той страницы, которую мы обрабатываем в данный момент. Для этого служат следующие методы:
logger.oneType('Какое-то сообщение')
Типовое сообщение, цвет сообщения будет белым.
logger.oneInfo('Какое-то сообщение')
Пример информационного сообщения, цвет будет ярко-синим.
logger.oneMes('Какое-то сообщение')
Пример простого сообщения, его цвет будет яркий магента.
logger.oneSuccess('Какое-то сообщение')
Пример успешного сообщения, его цвет будет ярко-зелёным.
logger.oneWarn('Какое-то сообщение')
Пример предупреждения, его цвет будет якро-жёлтым.
logger.oneError('Какое-то сообщение')
Пример сообщения об ошибки, его цвет будет ярко красным.
В основе данных методов лежит:
console.clear();
Весь вывод в консоль, который будет находиться выше этого метода будет удален. А все, что ниже соответственно останется. Для того, чтобы посмотреть как это работает я советую посмотреть следующий код.
Переключение темы
Я люблю яркие цвета, и по умолчанию для логера включена яркая тема. Допускаю, что это не всех устроит, поэтому ниже описано как переключать тему.
logger.changeTheme();
Этот метод переключает тему с яркой на обычную, и обратно.
logger.brightTheme();
Этот метод включает яркую тему.
logger.ordinaryTheme();
Этот метод включает обычную тему.
Получение времени
Представьте себе такую ситуацию, спайдер собирает данные, и вдруг происходит какая-нибудь ошибка. Очень часто возникает такая ситуация, что ошибки нужно записать в логи, и желательно, чтобы в логах ошибки записывались таким же образом, как они отображается в терминале. Чтобы проще было в них ориентироваться. Для того, чтобы не нужно было по новой генерить время, можно воспользоваться следующим методом:
const time = logger.bTimePeriod();
В переменной "time" будет лежать время в таком же формате, как оно отображается моим лоером. После данного метода другие методы вызывать не получится. Он возвращает время, а не экземпляр библиотеки.
logger.bTimePeriod()
.space()
.typeNoTime('Какое-то сообщение.');
// Будет ошибка
При таком вызове будет ошибка.
const time = logger.bTimePeriod();
logger.space()
.typeNoTime('Какое-то сообщение.');
// Можно ещё что-нибудь вызвать
При таком вызове все пройдет нормально. Вполне естественно, что если мы сделаем нечто подобное, время не будет отображаться:
logger.disableTime()
.disableDate();
// Или
logger.disableTimePeriod()
const time = logger.bTimePeriod();
Примеры кода
logger.space()
.typeNoTime('Сообщения без группировки')
.space();
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger
.space()
.typeNoTime('Включаю отображение полного года (logger.enableFullYear())')
.space();
logger.enableFullYear();
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.space()
.typeNoTime('Отключаю отображение полного года (logger.disableFullYear())')
.space();
logger.disableFullYear();
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.space()
.typeNoTime('Ниже идут сгруппированные сообщения')
.space();
logger.group('Пример сообщений');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.disableTime();
logger.group('Пример сообщени без времени (logger.disableTime())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.disableDate();
logger.group('Пример сообщени без даты (logger.disableDate())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.enableTime();
logger.group('Включаю время (logger.enableTime())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.enableDate();
logger.group('Включаю дату (logger.enableDate())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.disableTimePeriod();
logger.group('Отключаю временной период (logger.disableTimePeriod())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.enableTimePeriod();
logger.group("Включаю временной период (logger.enableTimePeriod())");
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.enableBg();
logger.group('Включаю background (logger.enableBg())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.disableBg();
logger.group("Отключаю background (logger.disableBg())");
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.group("Пример сообщений с background-ом");
logger.typeBg('Пример типового сообщения (logger.typeBg())');
logger.infoBg('Пример информационного сообщения (logger.infoBg())');
logger.mesBg('Пример простого сообщения (logger.mesBg())');
logger.successBg('Пример успешного сообщения (logger.successBg())');
logger.warnBg('Пример предупреждения (logger.warnBg())');
logger.errorBg('Пример ошибки (logger.errorBg())');
logger.endGroup();
logger.space();
logger.group("Пример сообщений без временного периода");
logger.typeNoTime('Пример типового сообщения (logger.typeNoTime())');
logger.infoNoTime('Пример информационного сообщения (logger.infoNoTime())');
logger.mesNoTime('Пример простого сообщения (logger.mesNoTime())');
logger.successNoTime('Пример успешного сообщения (logger.successNoTime())');
logger.warnNoTime('Пример предупреждения (logger.warnNoTime())');
logger.errorNoTime('Пример ошибки (logger.errorNoTime())');
logger.endGroup();
logger.changeTheme();
logger.space()
.space()
.space()
.typeNoTime('Ниже идёт обычная тема, не яркая (logger.changeTheme())')
logger.space()
.typeNoTime('Сообщения без группировки')
.space();
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger
.space()
.typeNoTime('Включаю отображение полного года (logger.enableFullYear())')
.space();
logger.enableFullYear();
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.space()
.typeNoTime('Отключаю отображение полного года (logger.disableFullYear())')
.space();
logger.disableFullYear();
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.space()
.typeNoTime('Ниже идут сгруппированные сообщения')
.space();
logger.group('Пример сообщений');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.disableTime();
logger.group('Пример сообщени без времени (logger.disableTime())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.disableDate();
logger.group('Пример сообщени без даты (logger.disableDate())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.enableTime();
logger.group('Включаю время (logger.enableTime())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.enableDate();
logger.group('Включаю дату (logger.enableDate())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.disableTimePeriod();
logger.group('Отключаю временной период (logger.disableTimePeriod())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.enableTimePeriod();
logger.group("Включаю временной период (logger.enableTimePeriod())");
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.enableBg();
logger.group('Включаю background (logger.enableBg())');
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.disableBg();
logger.group("Отключаю background (logger.disableBg())");
logger.type('Пример типового сообщения (logger.type())');
logger.info('Пример информационного сообщения (logger.info())');
logger.mes('Пример простого сообщения (logger.mes())');
logger.success('Пример успешного сообщения (logger.success())');
logger.warn('Пример предупреждения (logger.warn())');
logger.error('Пример ошибки (logger.error())');
logger.endGroup();
logger.space();
logger.group("Пример сообщений с background-ом");
logger.typeBg('Пример типового сообщения (logger.typeBg())');
logger.infoBg('Пример информационного сообщения (logger.infoBg())');
logger.mesBg('Пример простого сообщения (logger.mesBg())');
logger.successBg('Пример успешного сообщения (logger.successBg())');
logger.warnBg('Пример предупреждения (logger.warnBg())');
logger.errorBg('Пример ошибки (logger.errorBg())');
logger.endGroup();
logger.space();
logger.group("Пример сообщений без временного периода");
logger.typeNoTime('Пример типового сообщения (logger.typeNoTime())');
logger.infoNoTime('Пример информационного сообщения (logger.infoNoTime())');
logger.mesNoTime('Пример простого сообщения (logger.mesNoTime())');
logger.successNoTime('Пример успешного сообщения (logger.successNoTime())');
logger.warnNoTime('Пример предупреждения (logger.warnNoTime())');
logger.errorNoTime('Пример ошибки (logger.errorNoTime())');
logger.endGroup();