Некоторое время я не мог найти подходящее решение для мониторинга моих производственных и промежуточных журналов и получения уведомлений об ошибках в режиме реального времени с нужным уровнем детализации.

Как только я разобрался с этим зверем, пара часов работы и все было под контролем.

Третья сторона

Я начал искать достойный сторонний сервис, который отвечал бы моему списку потребностей:

  • Живой хвост
  • Дружественный и быстрый поиск и фильтрация журналов
  • Простая интеграция предупреждений
  • Простая интеграция с NodeJS предпочтительно через транспорт Winston
  • Интеграция со Slack для предупреждений
  • Дешево / бесплатно

Я пробовал papertrail, loggly logz.io и парочку других, которых не могу вспомнить, потому что они так отстойно.

Я обнаружил, что у logz.io есть бесплатный 1 ГБ на трехдневный план хранения, и они удовлетворили все мои требования.

Они используют Kibana для фильтрации журналов и создания предупреждений; Kibana как продукт визуализирует эластичные поисковые данные, но для нашей цели это просто отличный инструмент, позволяющий легко фильтровать данные. Он позволяет вам легко фильтровать ключи и значения журнала, однозначно показывает количество ключей и различные значения для ключей, очень удобен для пользователя, как только вы изучите основы.

Давай займемся делом

Настройка учетной записи logz.io:

Перейдите на https://logz.io и зарегистрируйте пробную учетную запись (когда пробная версия закончится, ваш план станет бесплатным с 1 ГБ в течение 3 дней хранения, это правда, даже если они не упоминают об этом везде i смотрел).

Интеграция logz.io с вашим регистратором NodeJS Winston

Winston - это «мульти-транспортная асинхронная библиотека ведения журнала для node.js». для его установки введите:

npm install - сохранить Winston

Теперь, когда вы вошли в logz.io, перейдите в

Https://app.logz.io/#/dashboard/data-sources/nodejs-winston для получения инструкций по интеграции пакета winston-logzio в ваш код. когда вы освоите основы, ваш код регистратора Winston должен выглядеть так:
https://gist.github.com/sht5/8b6a2e3bf5e5b07bfe1373d502adab42

здесь нужно отметить пару вещей:

  1. строка 7: вставьте ваш logz.io apiKey (токен)
  2. строка 9: установка этого ключа на «nodeJS» поможет дифференцировать источники журналов в будущем, если вы будете использовать logz.io для журналирования других микросервисов или клиентов, так что это хорошая идея.
  3. Строка 36–38: это гарантирует, что вы не отправляете журналы при разработке через localhost (хотя это возможно, если вы хотите протестировать, и может помочь при настройке вашей системы ведения журналов).

Создание полезных методов ведения журнала

Чтобы упростить ведение журнала в коде, а также упростить поиск и фильтрацию по ним на сайте logz.io, я предлагаю несколько служебных функций:

По возможности важно отправлять logz.io объект json, поскольку он индексирует их, что позволяет легко выполнять поиск и фильтрацию по ключам и значениям (подробнее об этом ниже).

объясним три метода:

logHttpRequestError - с помощью этого метода вы должны регистрировать http-запросы, которые закончились ошибкой, поэтому используйте его прямо перед отправкой кода ошибки своему клиенту и убедитесь, что сбои вашей конечной точки всегда заканчиваются журналированием с помощью этого метода. . Мне нравится делать мои серверные методы «доступными» (возвращать обещания) и регистрировать последний улов, который также отвечает ошибкой. этот метод получает следующие параметры:

  • request - HTTP-запрос, который в конечном итоге не удался. Я использую expressJS для настройки своих сервисов отдыха, и в моем примере это объект запроса expressJS, не стесняйтесь заменять его любым другим объектом запроса библиотеки. объект запроса позволяет регистрировать URL-адрес, пользователя, который инициировал электронную почту запроса (если вы используете веб-токены Json), параметры запроса и тело
  • errorObj - обнаруженная ошибка (объект ошибки javascript) - позволяет методу регистрировать сообщение об исключении и трассировку стека.

пример использования:

Также следует отметить, что мы установили errorType на HTTP_REST_ERROR, чтобы упростить фильтрацию этого или любого другого типа ошибок в logz.io.

logGenerelError- следует использовать при регистрации общих ошибок, что является разновидностью подмножества предыдущего метода, но добавляет переменную otherProperties для включения дополнительных свойств Json в соответствии с ситуацией в коде. при этом вы можете добавить важную информацию журнала, такую ​​как строки запросов к базе данных, которые привели к ошибке и т. д.

logSimpleTextError - если вы определили ошибку, но она не выдала ошибку javascript, вы можете просто записать текст с этой ошибкой.

Мониторинг ваших журналов через сайт logz.io

Как уже упоминалось, logz.io позволяет искать и фильтровать журналы с помощью инструмента Kibana от elasticSearch. после того, как вы настроите свои журналы, как мы обсуждали, вы легко сможете выполнять поиск и фильтрацию по ключам и значениям Json, видеть их процентное соотношение в вашем поиске, создавать таблицу для ваших нужд, и все это очень удобно, просто похоже магия. вот проблеск:

Настройка предупреждений об ошибках для ваших ошибок (или по электронной почте)

после настройки системы ведения журнала лучшее, что вы можете сделать, - это получать предупреждения об ошибках в режиме реального времени. После того, как вы определите поиск, как указано выше, нажмите кнопку «Создать предупреждение» вверху, и вы будете перенаправлены в область предупреждений, где вы можете определить:

  • Условия предупреждения - я настроил его так, чтобы он предупреждал меня о любых ошибках в течение пяти минут.

Определения предупреждений - имя и серьезность

И триггеры - в моем случае я отправляю его на специальный канал Slack, но вы также можете отправить его по электронной почте. Если вы все же выбрали Slack для задачи, вам необходимо создать специальный веб-перехватчик, см. Инструкции здесь https://logz.io/blog/elk-stack-slack-integration/

Нет боли, столько пользы

Процесс, который я описал здесь, занял у меня половину рабочего дня (включая его планирование и проектирование). Имея под рукой этот пятичасовой сеанс, я теперь могу получать в реальном времени уведомления об ошибках производства и постановки, включая все соответствующие детали, с кем это произошло, и я могу легко плавать в своем море журналов. так оно того стоит.

наслаждаться.