Давайте будем честными, разработчики больше занимаются отладкой, чем написанием фактического кода. Бывают случаи, когда вам нужно устранить проблему с приложением Node.js, журналы — это спасение. Они предоставляют информацию о серьезности проблемы, а также о ее первопричине. Таким образом, хорошие методы ведения журналов имеют решающее значение для мониторинга ваших серверов Node.js, отслеживания ошибок, проведения различных анализов и обнаружения возможностей оптимизации. В этой статье будут описаны лучшие методы ведения журналов, которым следует следовать при написании приложения Node.js.

1. Выбор правильной библиотеки

Разработчики Node.js, как правило, полагаются на консольные методы среды выполнения (такие как console.log()) для регистрации событий и предоставляют знакомый API, аналогичный консольному механизму Javascript в браузерах. У console.log() есть свои применения, но этого недостаточно, чтобы использовать его в качестве решения для ведения журнала в производственном приложении. Он предоставляет такие методы, как console.warn(), console.error(), console.debug(), но это всего лишь функции, выводящие стандартный вывод и не определяющие серьезность журнала.

Характеристики хорошей библиотеки журналов

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

Основные проблемы при выборе подходящей библиотеки

Запись:

Форматирование. Библиотека должна предоставлять правильные параметры форматирования журнала, которые помогут вам различать различные уровни ведения журнала, настраивать цвета и приоритеты уровней в соответствии с потребностями и удобством.

Хранение. Он также должен предоставлять способы настройки места, где разработчик может сохранять журналы, как мы говорили ранее.

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

одной из таких популярных библиотек является Winston, о которой мы поговорим в этом блоге.

2. Используйте правильные уровни логирования

Прежде чем приступить к изучению уровней журнала, давайте сначала установим библиотеку, чтобы вы могли опробовать команды и код по мере продвижения.

Установите библиотеку:

npm install winston

Независимо от того, какую систему именования используют разные библиотеки для обозначения уровней журналирования, концепция остается в основном одинаковой. Вот наиболее часто используемые уровни журналов в порядке убывания важности:

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

ОШИБКА: представляет собой ошибку в системе, которая может остановить конкретную операцию, но не систему в целом. Обычно это используется для регистрации ошибок, возвращаемых сторонним API.

ПРЕДУПРЕЖДЕНИЕ: указывает на необычные условия выполнения, которые никак не влияют на работающую систему.

ИНФОРМАЦИЯ. Это чисто информативные сообщения. Может использоваться для регистрации пользовательских или специфичных для приложения событий. Обычно этот уровень используется для регистрации запуска или завершения службы.

DEBUG: используется для представления диагностической информации, которая может понадобиться для устранения неполадок.

TRACE: собирает все возможные подробности о поведении приложения во время разработки.

Библиотека Winston, в частности, по умолчанию использует следующие уровни ведения журнала, где ошибка является наиболее серьезной, а глупая — наименее:

{
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  verbose: 4,
  debug: 5,
  silly: 6
}

Если вас не устраивает именование по умолчанию, вы можете изменить его, инициализировав пользовательский регистратор в соответствии с вашими потребностями в Winston.

const { createLogger, format, transports } = require('winston');
const logLevels = {
  fatal: 0,
  error: 1,
  warn: 2,
  info: 3,
  debug: 4,
  trace: 5,
};
const logger = createLogger({
  levels: logLevels,
  transports: [new transports.Console()],
});

Если вы хотите зарегистрировать сообщение, вы можете зарегистрировать нужный уровень непосредственно в пользовательском регистраторе.

logger.info('System Started');
logger.fatal('Fatal error occuered');

3. Структурная регистрация

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

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

Одна из лучших практик — использовать JSON для ведения журнала, поскольку он легко читается людьми, а также может анализироваться машинами и может быть легко преобразован в другие форматы. При входе в JSON необходимо использовать стандартную схему, чтобы семантика каждого поля была четко определена. Это также упрощает поиск того, что вы ищете, при анализе записей журнала.

Winston по умолчанию выводит строку JSON с двумя полями: сообщение и уровень. Сообщение содержит текст, который был зарегистрирован, а уровень указывает уровень журнала. мы можем настроить это с помощью winston.format. например, вы можете добавить метку времени, объединив метку времени и JSON.

const { createLogger, format, transports } = require('winston');
const logger = createLogger({
  format: format.combine(format.timestamp(), format.json()),
  transports: [new transports.Console({})],
});

4. Пишите описательные сообщения

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

Один из плохих примеров сообщения журнала:

Error occured!!

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

"PUT" request to "<https://example.com/api>" failed. Response code: "503", response message: "Internal Server Error!". Retrying after "60" seconds.

Из этого сообщения мы знаем, что запрос к серверу example.com не удался. Вероятная причина в том, что сторонний сервер может быть недоступен по неизвестным причинам.

5. Избегайте регистрации конфиденциальных данных

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

6. Добавьте правильный контекст в свои журналы

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

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

const logger = createLogger({
  format: format.combine(format.timestamp(), format.json()),
  defaultMeta: {
    service: 'auth-service',
  },
  transports: [new transports.Console({})],
});

будет показан следующий вывод

1
{"message":"User loggedIn successfully","level":"info","service":"auth-service","timestamp":"2020-09-29T10:56:14.651Z"}

первоначально опубликовано на amodshinde.com.