HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Во всех программах со временем появляются ошибки. Чтобы понимать, где они возникают в коде, используются методы наблюдения.</p>
1 <p>Во всех программах со временем появляются ошибки. Чтобы понимать, где они возникают в коде, используются методы наблюдения.</p>
2 <p>В этом уроке рассмотрим самый распространенный из методов -<strong>логирование</strong>. Мы разберем, как он используется в Go-приложениях, что можно сделать с помощью стандартного пакета log и почему ему предпочитают сторонний пакет logrus.</p>
2 <p>В этом уроке рассмотрим самый распространенный из методов -<strong>логирование</strong>. Мы разберем, как он используется в Go-приложениях, что можно сделать с помощью стандартного пакета log и почему ему предпочитают сторонний пакет logrus.</p>
3 <h2>Что такое логирование и как им пользоваться</h2>
3 <h2>Что такое логирование и как им пользоваться</h2>
4 <p>Логирование помогает найти места с ошибками в работающей программе. С его помощью можно записывать сообщения в выводы: в поток вывода операционной системы, файл или сетевое соединение. В Go вывод логов по умолчанию осуществляется в стандартный вывод операционной системы stdout.</p>
4 <p>Логирование помогает найти места с ошибками в работающей программе. С его помощью можно записывать сообщения в выводы: в поток вывода операционной системы, файл или сетевое соединение. В Go вывод логов по умолчанию осуществляется в стандартный вывод операционной системы stdout.</p>
5 <p>Рассмотрим, как используется логирование в Go-приложениях на примере двух пакетов:</p>
5 <p>Рассмотрим, как используется логирование в Go-приложениях на примере двух пакетов:</p>
6 <ul><li>Стандартный пакет log</li>
6 <ul><li>Стандартный пакет log</li>
7 <li>Сторонний пакет logrus</li>
7 <li>Сторонний пакет logrus</li>
8 </ul><p>Разберем их подробнее.</p>
8 </ul><p>Разберем их подробнее.</p>
9 <h3>Логируем со стандартным пакетом log</h3>
9 <h3>Логируем со стандартным пакетом log</h3>
10 <p>В Go есть стандартный пакет log для логирования. С его помощью можно:</p>
10 <p>В Go есть стандартный пакет log для логирования. С его помощью можно:</p>
11 <ul><li>Установить место записи логов</li>
11 <ul><li>Установить место записи логов</li>
12 <li>Писать логи построчно</li>
12 <li>Писать логи построчно</li>
13 <li>Заканчивать выполнение всей программы в случае фатальных ошибок</li>
13 <li>Заканчивать выполнение всей программы в случае фатальных ошибок</li>
14 </ul><p>Так это выглядит в коде:</p>
14 </ul><p>Так это выглядит в коде:</p>
15 <p>Рассмотрим, как используется пакет log на конкретном примере. Допустим, у нас есть следующее веб-приложение:</p>
15 <p>Рассмотрим, как используется пакет log на конкретном примере. Допустим, у нас есть следующее веб-приложение:</p>
16 <p>Здесь есть два места, где функции возвращают ошибки, но не логируются:</p>
16 <p>Здесь есть два места, где функции возвращают ошибки, но не логируются:</p>
17 <ul><li>Функция w.Write() - возвращает ошибку, если не удалось отправить ответ клиенту</li>
17 <ul><li>Функция w.Write() - возвращает ошибку, если не удалось отправить ответ клиенту</li>
18 <li>Функция http.ListenAndServe() - возвращает ошибку, если не удалось запустить веб-приложение на заданном порту</li>
18 <li>Функция http.ListenAndServe() - возвращает ошибку, если не удалось запустить веб-приложение на заданном порту</li>
19 </ul><p>Такие ошибки называют<strong>нелогированными</strong>. Они могут привести к завершению программы без вывода. В этом случае мы не сможем определить причину ошибки, поэтому в будущем проблема может повториться.</p>
19 </ul><p>Такие ошибки называют<strong>нелогированными</strong>. Они могут привести к завершению программы без вывода. В этом случае мы не сможем определить причину ошибки, поэтому в будущем проблема может повториться.</p>
20 <p>Логирование помогает увидеть, в каком месте программы произошло непредвиденное поведение и в чем причина. Поэтому когда из функции возвращаются ошибки, их нужно логировать.</p>
20 <p>Логирование помогает увидеть, в каком месте программы произошло непредвиденное поведение и в чем причина. Поэтому когда из функции возвращаются ошибки, их нужно логировать.</p>
21 <p>Используем пакет log для этого веб-приложения, чтобы видеть ошибки:</p>
21 <p>Используем пакет log для этого веб-приложения, чтобы видеть ошибки:</p>
22 <p>Теперь при первом запуске программы в консоли отобразится вывод:</p>
22 <p>Теперь при первом запуске программы в консоли отобразится вывод:</p>
23 <p>А если попытаться поднять второй сервер, то отобразится ошибка:</p>
23 <p>А если попытаться поднять второй сервер, то отобразится ошибка:</p>
24 <p>Стандартный пакет log подходит для случаев, как наш пример. При этом в реальных приложениях он не используется из-за следующих недостатков:</p>
24 <p>Стандартный пакет log подходит для случаев, как наш пример. При этом в реальных приложениях он не используется из-за следующих недостатков:</p>
25 <ul><li>Нет четко разделенных уровней логирования: DEBUG, INFO, ERROR</li>
25 <ul><li>Нет четко разделенных уровней логирования: DEBUG, INFO, ERROR</li>
26 <li>Пакет работает только со строками. Если нужно логировать другой тип данных, сначала придется вручную конвертировать его в строку</li>
26 <li>Пакет работает только со строками. Если нужно логировать другой тип данных, сначала придется вручную конвертировать его в строку</li>
27 </ul><p>Из-за этих недостатков появилось много сторонних пакетов для логирования. Один из самых популярных -<a>logrus</a>. Рассмотрим, как его использовать в Go-приложениях.</p>
27 </ul><p>Из-за этих недостатков появилось много сторонних пакетов для логирования. Один из самых популярных -<a>logrus</a>. Рассмотрим, как его использовать в Go-приложениях.</p>
28 <h3>Логируем со сторонним пакетом logrus</h3>
28 <h3>Логируем со сторонним пакетом logrus</h3>
29 <p>Пакет logrus решает недостатки стандартного пакета log. В этом пакете есть функции, чтобы записывать логи на разных уровнях. Еще с помощью logrus можно вносить в сообщения дополнительную информацию любого типа данных.</p>
29 <p>Пакет logrus решает недостатки стандартного пакета log. В этом пакете есть функции, чтобы записывать логи на разных уровнях. Еще с помощью logrus можно вносить в сообщения дополнительную информацию любого типа данных.</p>
30 <p>Рассмотрим основные возможности пакета logrus:</p>
30 <p>Рассмотрим основные возможности пакета logrus:</p>
31 <p>Как видно из кода, у logrus есть преимущества перед log. Например, с его помощью можно логировать на определенных уровнях. Поэтому стандартный пакет можно смело заменять сторонним:</p>
31 <p>Как видно из кода, у logrus есть преимущества перед log. Например, с его помощью можно логировать на определенных уровнях. Поэтому стандартный пакет можно смело заменять сторонним:</p>
32 <p>Снова пытаемся запустить веб-приложение в двух процессах и при запуске второго получаем ошибку:</p>
32 <p>Снова пытаемся запустить веб-приложение в двух процессах и при запуске второго получаем ошибку:</p>
33 <p>Так логирование помогает находить ошибки в работающей программе. Их стоит сразу исправлять, чтобы они не появлялись в будущем, и не произошло непредвиденное поведение приложения.</p>
33 <p>Так логирование помогает находить ошибки в работающей программе. Их стоит сразу исправлять, чтобы они не появлялись в будущем, и не произошло непредвиденное поведение приложения.</p>
34 <h2>Выводы</h2>
34 <h2>Выводы</h2>
35 <ul><li>С помощью логирования можно найти места с ошибками в работающей программе</li>
35 <ul><li>С помощью логирования можно найти места с ошибками в работающей программе</li>
36 <li>У стандартной библиотеки логирования log в Go есть недостатки: нет четко разделенных уровней логирования и он работает только со строками. Из-за этих недостатков в проектах используют сторонние пакеты</li>
36 <li>У стандартной библиотеки логирования log в Go есть недостатки: нет четко разделенных уровней логирования и он работает только со строками. Из-за этих недостатков в проектах используют сторонние пакеты</li>
37 <li>Со сторонним пакетом logrus можно писать логи на разных уровнях, а еще добавлять в сообщения контекст в виде любого типа данных</li>
37 <li>Со сторонним пакетом logrus можно писать логи на разных уровнях, а еще добавлять в сообщения контекст в виде любого типа данных</li>
38 </ul>
38 </ul>