Логирование ошибок и событий — важная часть любой разработки, особенно в контексте веб-приложений. В фреймворке Marko существует несколько подходов для эффективного логирования, включая как встроенные механизмы, так и сторонние библиотеки, которые можно интегрировать для улучшения отслеживания состояния приложения. В данной главе рассмотрены основные способы логирования, а также примеры реализации обработки ошибок и событий в приложении, построенном на Marko.
Marko, как и другие серверные фреймворки, может использовать
различные механизмы для логирования на серверной стороне. В Node.js, в
рамках которого часто используется Marko, доступны разнообразные
библиотеки для логирования, например, winston,
bunyan и pino. Они обеспечивают гибкую
настройку уровня логирования, формата сообщений и местоположения их
записи.
winston для логированияДля начала работы с winston необходимо установить
соответствующий пакет:
npm install winston
Затем создаём объект логера с необходимыми параметрами:
const winston = require('winston');
// Конфигурация логера
const logger = winston.createLogger({
level: 'info', // Уровень логирования
transports: [
new winston.transports.Console({ format: winston.format.simple() }), // Вывод в консоль
new winston.transports.File({ filename: 'error.log', level: 'error' }) // Запись ошибок в файл
],
});
Теперь можно логировать ошибки и события:
logger.info('Информационное сообщение');
logger.error('Ошибка выполнения');
winston также поддерживает логирование с форматированием
и фильтрацией по уровням. Это позволяет настроить систему логирования
под нужды проекта, например, выводить только ошибки в рабочем приложении
и подробные сообщения при разработке.
Ошибки могут возникать по разным причинам, и важно правильно их обрабатывать. В Marko для этого можно использовать стандартный механизм обработки исключений в Node.js. Например, для централизованного логирования ошибок на сервере можно использовать следующий подход:
process.on('uncaughtException', (err) => {
logger.error(`Необработанное исключение: ${err.message}`, { stack: err.stack });
});
process.on('unhandledRejection', (reason, promise) => {
logger.error('Необработанное отклонение промиса', { reason, promise });
});
Этот код позволяет ловить все необработанные исключения и отклонённые промисы, записывая информацию о них в лог.
Для логирования событий на клиентской стороне также можно использовать различные подходы. Например, Marko предоставляет возможность легко интегрировать любые сторонние библиотеки для работы с клиентским JavaScript.
console для логированияНа клиентской стороне можно воспользоваться стандартным объектом
console, который предоставляет различные методы для
логирования:
console.log('Информационное сообщение');
console.error('Ошибка');
console.warn('Предупреждение');
Хотя console — это простой инструмент, для более сложных
приложений предпочтительнее использовать специализированные библиотеки,
такие как loglevel или pino.
Одной из популярных библиотек для логирования на клиентской стороне
является loglevel. Она позволяет гибко управлять уровнем
логирования и поддерживает различные транспорты для вывода сообщений.
Для интеграции необходимо установить библиотеку:
npm install loglevel
После установки создаём экземпляр логера:
import log from 'loglevel';
log.setLevel('debug'); // Установка уровня логирования
log.debug('Отладочное сообщение');
log.info('Информационное сообщение');
log.warn('Предупреждение');
log.error('Ошибка');
loglevel позволяет настраивать вывод сообщений в
зависимости от уровня, что полезно для разработки и отладки.
Для масштабных проектов полезно интегрировать системы сбора аналитики и логирования. Одним из таких сервисов является Sentry, который позволяет автоматически собирать и отслеживать ошибки и события в реальном времени.
Для интеграции Marko с Sentry на серверной стороне необходимо установить соответствующую библиотеку:
npm install @sentry/node
После установки и настройки можно использовать Sentry для отправки ошибок:
const Sentry = require('@sentry/node');
Sentry.init({ dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0' });
try {
throw new Error('Что-то пошло не так');
} catch (err) {
Sentry.captureException(err); // Отправка ошибки в Sentry
}
Для клиента необходимо использовать библиотеку
@sentry/browser:
npm install @sentry/browser
Затем, в клиентском коде, можно передавать события:
import * as Sentry from '@sentry/browser';
Sentry.init({ dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0' });
Sentry.captureMessage('Информационное сообщение');
Sentry.captureException(new Error('Ошибка на клиенте'));
Таким образом, можно централизованно собирать данные об ошибках и событиях как на сервере, так и на клиенте.
При работе с асинхронным кодом важно обеспечить правильную обработку ошибок и логирование состояний выполнения. Для этого можно использовать промисы или async/await.
Для асинхронных операций важно правильно ловить ошибки и логировать их. Например, можно использовать следующий код:
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
logger.info('Данные получены', { data });
} catch (err) {
logger.error('Ошибка при получении данных', { error: err.message });
}
}
Этот код позволяет ловить ошибки при выполнении асинхронных операций и записывать их в лог с дополнительной информацией.
Логирование состояния приложения помогает не только при отладке, но и для мониторинга в реальном времени. Для этого можно логировать различные этапы жизненного цикла приложения, от запуска до завершения работы.
Для логирования различных событий, связанных с запуском и завершением приложения, можно использовать:
logger.info('Приложение запущено');
process.on('SIGINT', () => {
logger.info('Приложение завершает работу');
process.exit();
});
Этот подход помогает отслеживать важные моменты в работе приложения, такие как старт, остановка или сбои.
Использование разных уровней логирования: Важно настроить различные уровни логирования для различной информации (отладка, информация, предупреждения, ошибки). Это помогает фильтровать важную информацию и минимизировать избыточные данные.
Централизованное логирование: Для более сложных приложений, особенно с распределенной архитектурой, рекомендуется использовать централизованные системы логирования, такие как ELK Stack (Elasticsearch, Logstash, Kibana), чтобы собирать и анализировать логи со всего приложения.
Мониторинг и алерты: Важно не только собирать логи, но и настраивать мониторинг и оповещения на основе этих логов. Это позволяет оперативно реагировать на сбои и аномалии в работе приложения.
Обработка чувствительной информации: Логи могут содержать чувствительную информацию, такую как пароли или данные пользователей. Поэтому необходимо избегать записи таких данных в логи или использовать методы для их анонимизации.
Логирование — это не просто инструмент для отладки, но и важная часть инфраструктуры для мониторинга и управления приложением на всех этапах его жизненного цикла.