Можно ли хранить логи приложения на Node.js в базе данных MySQL, или существуют более подходящие решения для этой задачи?

Я разрабатываю веб-сервис на Fastify и хочу правильно настроить логгирование. В предыдущих проектах я использовал console.log, и при возникновении ошибок просто просматривал консоль, но это имеет свои недостатки: при перезапуске сервиса вывод в консоль очищается. 

Теперь я рассматриваю идею записи логов в отдельную базу данных с добавлением лейблов (info, error, critical) и другой полезной информации, чтобы упростить анализ логов. 

Существуют ли более элегантные решения для логгирования, которые упростят разбор логов и сделают его менее трудоемким?
  • 25 декабря 2024 г. 16:33
Ответы на вопрос 6
Хранение логов в базе данных MySQL — это вполне допустимое решение, но не всегда самое оптимальное, особенно если у вас будет большое количество логов. Есть несколько факторов, которые стоит учитывать:

### Плюсы хранения логов в базе данных:
1. **Структурированные данные**: Логи могут быть сохранены в структурированном виде, что позволяет эффективно выполнять поиск и фильтрацию по различным полям (дата, уровень и т. д.).
2. **Удобный доступ**: Логи легко доступны и могут быть обработаны с помощью SQL-запросов.
3. **Легко интегрируется**: Если у вас уже есть база данных, это решение может быть проще для реализации.

### Минусы:
1. **Производительность**: Частая запись в базу данных может вызвать тормоза, особенно при высоких нагрузках.
2. **Увеличение объема данных**: Логи могут занимать много места, и работа с базой данных может стать сложной задачей при масштабах.
3. **Управление жизненным циклом**: Вам придется самостоятельно управлять старыми логами, например, реализовать их ротацию или удаление.

### Альтернативные решения для логгирования:
1. **Файлы логов**: Простой способ записывать логи в файлы на файловой системе. Это позволяет сохранить исторические данные без необходимости в базе данных. Кроме того, вы можете использовать такие инструменты, как `logrotate` для управления размером логов.

2. **Системы логирования**:
   - **Winston** или **Bunyan**: Эти библиотеки для логгирования на Node.js предлагают множество функций, таких как разные уровни логирования, форматирование, возможность записи в разные транспорты (файлы, базы данных, удаленные сервисы) и интеграцию с системами мониторинга.
   - **Pino**: Быстрая и низкоуровневая библиотека для логгирования, также очень популярная в экосистеме Node.js.

3. **Логирование в удаленные сервисы**: 
   - **ELK Stack** (Elasticsearch, Logstash, Kibana): Позволяет собирать, хранить и визуализировать логи. Logstash может принимать логи от вашего приложения, а Kibana предоставляет мощные инструменты визуализации.
   - **Prometheus + Grafana**: Подходит для метрик, но также поддерживает логирование через отдельные библиотеки.
   - **Sentry** или **Loggly**: Эти сервисы тоже могут помочь в централизованном хранении и анализе логов.

4. **Kafka** или другие брокеры сообщений: Если у вас большие объемы логов и требуется высокая доступность и масштабируемость, вы можете рассмотреть возможность использования Kafka для передачи логов, а затем обрабатывать их в реальном времени или хранить в более подходящих системах (например, в той же ELK).

### Заключение:
Если вы хотите, чтобы ваше логирование было более гибким и мощным, рекомендую использовать специализированные библиотеки для логгирования, такие как Winston или Pino, и рассмотреть возможность интеграции с системами анализа и визуализации логов. Хранение логов в MySQL может быть приемлемым для маленьких проектов, но для больших приложений лучше использовать более масштабируемые решения.
Есть более элегантное решение. 
Называется Elastic Stack
Но может есть более элегантные решения при котором разбор логов не будет адским занятием?
писать логи стандартными средствами системы, следующий этап ELK, но это точно не для пет-проектов
Есть - уже лет 10+ назад придумали БД для логов. Самые популярные сегодня - Elastic (== ELK в прошлом) и Loki. 
Есть куча облачных сервисов на базе этих БД.
Все современные логгеры поддерживают log shipping по сети.
Логи нужно не просто писать в какую-то базу, а делать их машиночитаемыми, иначе смысла нет. 

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

А так, первым шагом можно вместо записи в базу данных, просто писать в jsonl (построчно по json на событие), по меньше упаковки в человекочитаемые строки и побольше читаемые машиной, постаравшийсь полностью исключить вывод сообщений об ошибках в stdout/stderr, и над именованием файлов подумать, что бы удобнее с ними было работать.
Писать в файлы так как их можно прочитать где угодно, вытащить с убитой системы и тд, самое идеальное решение (не зря логи все в файлах), причем продумать формат так что бы его можно было легко спарсить через утилиты cli, мне очень нравится формат логов nginx (поэтому советую присмотреться к нему). В любом случае все мониторинговые системы, будут брать данные из коллекторов логов и тд. Можно конечно написать для любимого стака отдельный коннектор, что бы вывод следовал конкретной идеологии(например что бы лог писался сразу в TSDB), но это уже как плюшка мне кажется.
Похожие вопросы