Веб-разработка на Go
Теория: Логирование в веб-приложении
Во всех программах со временем появляются ошибки. Чтобы понимать, где они возникают в коде, используются методы наблюдения.
В этом уроке рассмотрим самый распространенный из методов — логирование. Мы разберем, как он используется в Go-приложениях, что можно сделать с помощью стандартного пакета log и почему ему предпочитают сторонний пакет logrus.
Что такое логирование и как им пользоваться
Логирование помогает найти места с ошибками в работающей программе. С его помощью можно записывать сообщения в выводы: в поток вывода операционной системы, файл или сетевое соединение. В Go вывод логов по умолчанию осуществляется в стандартный вывод операционной системы stdout.
Рассмотрим, как используется логирование в Go-приложениях на примере двух пакетов:
- Стандартный пакет
log - Сторонний пакет
logrus
Разберем их подробнее.
Логируем со стандартным пакетом log
В Go есть стандартный пакет log для логирования. С его помощью можно:
- Установить место записи логов
- Писать логи построчно
- Заканчивать выполнение всей программы в случае фатальных ошибок
Так это выглядит в коде:
Рассмотрим, как используется пакет log на конкретном примере. Допустим, у нас есть следующее веб-приложение:
Здесь есть два места, где функции возвращают ошибки, но не логируются:
- Функция
w.Write()— возвращает ошибку, если не удалось отправить ответ клиенту - Функция
http.ListenAndServe()— возвращает ошибку, если не удалось запустить веб-приложение на заданном порту
Такие ошибки называют нелогированными. Они могут привести к завершению программы без вывода. В этом случае мы не сможем определить причину ошибки, поэтому в будущем проблема может повториться.
Логирование помогает увидеть, в каком месте программы произошло непредвиденное поведение и в чем причина. Поэтому когда из функции возвращаются ошибки, их нужно логировать.
Используем пакет log для этого веб-приложения, чтобы видеть ошибки:
Теперь при первом запуске программы в консоли отобразится вывод:
А если попытаться поднять второй сервер, то отобразится ошибка:
Стандартный пакет log подходит для случаев, как наш пример. При этом в реальных приложениях он не используется из-за следующих недостатков:
- Нет четко разделенных уровней логирования: DEBUG, INFO, ERROR
- Пакет работает только со строками. Если нужно логировать другой тип данных, сначала придется вручную конвертировать его в строку
Из-за этих недостатков появилось много сторонних пакетов для логирования. Один из самых популярных — logrus. Рассмотрим, как его использовать в Go-приложениях.
Логируем со сторонним пакетом logrus
Пакет logrus решает недостатки стандартного пакета log. В этом пакете есть функции, чтобы записывать логи на разных уровнях. Еще с помощью logrus можно вносить в сообщения дополнительную информацию любого типа данных.
Рассмотрим основные возможности пакета logrus:
Как видно из кода, у logrus есть преимущества перед log. Например, с его помощью можно логировать на определенных уровнях. Поэтому стандартный пакет можно смело заменять сторонним:
Снова пытаемся запустить веб-приложение в двух процессах и при запуске второго получаем ошибку:
Так логирование помогает находить ошибки в работающей программе. Их стоит сразу исправлять, чтобы они не появлялись в будущем, и не произошло непредвиденное поведение приложения.
Выводы
- С помощью логирования можно найти места с ошибками в работающей программе
- У стандартной библиотеки логирования
logв Go есть недостатки: нет четко разделенных уровней логирования и он работает только со строками. Из-за этих недостатков в проектах используют сторонние пакеты - Со сторонним пакетом
logrusможно писать логи на разных уровнях, а еще добавлять в сообщения контекст в виде любого типа данных
