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

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

Вход в систему в двух словах

Что логируется? Под ведением журнала мы обычно подразумеваем процесс записи событий, происходящих в приложении. В контексте Node.js ведение журнала обычно включает в себя запись сообщений в файл, который команда разработчиков может использовать для диагностики и устранения возникающих проблем.

Каковы основные подходы к логированию? Выполнить его можно по-разному. Ведение журнала консоли включает вывод сообщений на консоль, что помогает отладке во время разработки. Это простая и полезная техника для изучения или создания небольших проектов Node.js. Однако это не рекомендуется для использования в производственной среде, так как ведение журнала консоли может быть медленным и недоступным в некоторых производственных средах.

Кто использует ведение журнала? Он используется на месте или выделенными командами разработчиков Node.js, инженерами DevOps и ИТ-операторами для диагностики и устранения проблем, возникающих в приложении. Регистрируя соответствующие данные, эти команды могут получить ценную информацию о том, как ведет себя приложение и что может вызывать проблемы. Кроме того, его можно использовать для мониторинга производительности и доступности запущенного приложения Node.js после завершения разработки. Обеспечение его бесперебойной работы и предоставление ценности пользователям имеет решающее значение.

Читайте также Проектирование надежности сайта и его влияние на качество программного обеспечения

Каковы основные проблемы ведения журнала? Если ваше приложение Node.js генерирует тонны сообщений, файлы, содержащие все эти данные, со временем могут стать довольно большими. Большие файлы в этом случае не обязательно означают большие преимущества, поскольку они могут содержать данные нулевой важности. Регулярная ротация файлов помогает избежать больших файлов. Тем не менее, команде разработчиков может быть сложно реализовать это правильно, поскольку вы должны убедиться, что не потеряете важную информацию. После того, как вы сгенерировали файлы журналов, очень важно иметь возможность анализировать их для выявления проблем в вашем приложении Node.js. Это может быть непросто, если вы имеете дело с большими файлами или у вас нет подходящих инструментов для их анализа.

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

Библиотеки журналирования Node.js, которые стоит попробовать

Компании-разработчики Node.js могут полагаться на консольный API и методы ведения журналов, которые он предоставляет. Однако данные, собранные таким образом, могут быть трудно анализируемыми. Библиотеки журналов Node.js, с другой стороны, обеспечивают поддержку JSON и включают инструменты для добавления, сортировки или отправки данных в заданное место назначения.

Читайте также Node.js против Java. Кто обыгрывает кого в корпоративной веб-разработке

Большинство библиотек можно добавить в проекты разработки Node.js с помощью npm. Потратьте некоторое время на некоторые исследования, и вы найдете дюжину. Поскольку охват такого обширного набора инструментов выходит за рамки этой статьи, мы сосредоточимся на четырех из них, а именно на Winston, Loglevel, Bunyan и Pino. Мы рассмотрим эти инструменты разработки в порядке их популярности, согласно данным, предоставленным тенденциями npm:

Уинстон

Winston — это мощная и гибкая библиотека для Node.js, простая в использовании и с широкими возможностями настройки. Он предлагает различные уровни журналов, настраиваемые форматы и несколько транспортов для обработки журналов (например, консоль, файл, HTTP и т. д.).

Чтобы использовать Winston (или любую другую библиотеку ведения журналов, которую мы обсудим позже) для разработки Node.js, вам сначала нужно установить ее с помощью npm. Вы можете сделать это, выполнив следующую команду в своем терминале:

npm install winston

Установив библиотеку, вы можете начать использовать ее в своем приложении Node.js. Вот пример того, как настроить и использовать Winston для добавления данных в файл:

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  defaultMeta: { service: 'my-service' },
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

logger.log({
  level: 'info',
  message: 'Hello, Winston!'
});

Здесь мы создали новый регистратор Node.js с помощью метода winston.createLogger() и указали уровень журнала как info. Мы также определили два транспорта для записи сообщений об ошибках в файл с именем error.log и всех остальных сообщений в файл с именем combined.log.

Наконец, мы вызвали метод logger.log() для регистрации сообщения. При выполнении этого кода в combined.log будет записано сообщение «Привет, Уинстон!». Например, есть объект JSON, который будет добавлен в этот файл, если мы запустим наше приложение Node.js:

{"level":"info","message":"Hello, Winston!","service":"my-service","timestamp":"2023-04-18T14:30:00.000Z"}

Как правило, при использовании Winston или других библиотек Node.js в процессе разработки данные, записываемые в файл, будут зависеть от того, что вы решите включить в сообщение. Вы можете настроить формат записи с помощью метода winston.format() и включить в свое приложение любые релевантные данные, которые вы хотите отслеживать. Например, это может быть информация о HTTP-запросах, запросах к базе данных или взаимодействии с пользователем, в зависимости от того, что имеет отношение к текущим потребностям разработки.

Логуровень

Loglevel — это легкая библиотека для разработки Node.js, которая предоставляет простой способ отслеживания событий в вашем приложении. Он также поддерживает несколько уровней ведения журнала и может использоваться как синхронно, так и асинхронно. Давайте посмотрим, как мы можем настроить и использовать loglevel для вывода сообщения на консоль на этот раз:

In general, when using Winston or other Node.js libraries in development, the data that is logged to the file will depend on what you choose to include in the message. You can customize the format of the record using the winston.format() method, and include any relevant data you want to track in your application. For example, it might be information about HTTP requests, database queries, or user interactions, depending on what is relevant to the current development needs.

Loglevel
Loglevel is a lightweight library for Node.js development that provides a simple way to track events in your application. It also supports multiple log levels and can be used both synchronously and asynchronously. Let’s see how we can configure and use loglevel to log a message to the console this time:

В этом примере мы импортировали библиотеку loglevel Node.js с помощью метода require() и установили уровень журнала на «info» с помощью log .setLevel(). Затем мы вызвали метод log.info(), чтобы записать сообщение информационного уровня в консоль. При запуске этого кода на консоль будет выведено сообщение «Hello, loglevel!».

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

Пино

Pino — это быстрая библиотека разработки Node.js с низкими накладными расходами, предназначенная для высокопроизводительного и производственного использования. Он использует поточную архитектуру, которая позволяет писать напрямую в любой пункт назначения, не блокируя основной цикл событий Node.js. Попробуем заставить Pino работать:

const pino = require('pino');

const logger = pino({
  level: 'info',
  prettyPrint: true,
  formatters: {
    level: (label, number) => {
      return { level: label }
    }
  }
});

logger.info('Hello, Pino!');

В этом случае регистратор настроен на запись данных на уровне «информация» или выше. Для параметра prettyPrint установлено значение true, что означает, что выходные данные будут отформатированы в удобочитаемом виде. Параметр formatters — это объект, который позволяет настроить форматирование определенных полей. В данном случае для поля level указывается настраиваемый модуль форматирования, который просто возвращает свойство label аргумента level.

При конфигурации по умолчанию сообщение будет записано в файл в формате JSON со следующей структурой:

{"level":30,"time":1647731400000,"msg":"Hello, Pino!","pid":1234}

Где уровень – числовое значение, представляющее уровень ведения журнала, время – временная метка события Unix, msg – регистрируемое сообщение, а pid — это идентификатор процесса Node.js, записывающего сообщение.

Баньян

Bunyan — это быстрая, расширяемая и простая в использовании библиотека ведения журналов для разработки Node.js. Он особенно хорошо подходит для использования в крупномасштабных производственных средах, где необходимо управлять данными и анализировать их в масштабе. Вот пример того, как настроить и использовать Bunyan:

const bunyan = require('bunyan');

const logger = bunyan.createLogger({
  name: 'myapp',
  streams: [
    {
      path: '/var/log/myapp.log',
    },
  ],
});

logger.info('Hello, Bunyan!');

Здесь мы инициализируем новый экземпляр регистратора, используя библиотеку ведения журналов Bunyan Node.js. Метод createLogger() вызывается с объектом параметров, содержащим свойство name, для которого задано значение myapp. Он указывает имя экземпляра регистратора, что полезно для различения данных из разных источников в одном и том же файле.

Кроме того, объект options указывает свойство streams, которое представляет собой массив выходных потоков для записи журналов. В этом случае есть только один поток, который пишет в /var/log/myapp.log.

При вызове метода logger.info() сообщение будет записано в указанный выходной поток. Точный формат данных будет зависеть от конфигурации экземпляра регистратора и выбранного формата вывода. В этом случае журнал будет обновляться данными в формате JSON, выглядящими следующим образом:

{"name":"myapp","hostname":"your_hostname","pid":1234,"level":30,"msg":"Hello, Bunyan!","time":"2023-04-19T10:00:00.000Z","v":0}

Выводы

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

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