Когда у вас сложный код, много всего может пойти не так. Чтобы понимать, что именно в коде сломано, используют логгеры. Вот что это, как работает и как применить в вашем проекте.
Что такое логгер
Логгер — это специальный модуль, библиотека или отдельная программа, которая реагирует на события в программе и записывает всё, что там происходит. Эти записи называются логами, и чаще всего это обычный текстовый файлик. Когда что-то в программе идёт не так, разработчик смотрит лог и ищет, в какой момент и где возникла проблема.
Иногда лог нужен для ведения хронологии — что в какой момент сработало и с какими параметрами. Например, во сколько кто подключился к системе и какие файлы качал. Это может помочь в расследованиях всяческих инцидентов.
Где может храниться лог
Текстовый файл — самая простая система хранения логов. Ещё логи могут храниться в базе данных, например когда в программе работает одновременно много сервисов и нужно собрать всю информацию об их работе.
Логи могут записываться на другой компьютер. Так иногда делают системные администраторы, чтобы собирать информацию о работе нескольких серверов.
Также логи могут отправляться в другую программу, например в систему мониторинга и аналитики.
Как работает логгер
Логгер ничего не делает сам по себе, и, чтобы в лог попала какая-то запись, программист должен добавить в программу команду типа такой:
«Запиши в лог: в {hour} часов {min} минут к серверу подключился новый пользователь с адресом {IP}»
Для этого нужно сначала подключить логгер, который подходит вашему языку программирования. Например, импортировать библиотеку в Python или добавить скрипт в JavaScript:
<script src="debug.js">
После этого мы получаем доступ к логгеру и можем что-нибудь отправить в лог:
debug('Такой-то модуль загрузился')
На самом деле мы уже много раз использовали логгер в своих проектах. Например, мы выводили промежуточные результаты в разных алгоритмах сортировки на JavaScript, чтобы посмотреть, как код работает изнутри. Для этого мы писали команду console.log()
— она выводит наше сообщение в консоль.
Уровни логирования
Обычно в лог пишут все события — и штатные срабатывания, и ошибки. Но в проблемной ситуации нас будут интересовать только ошибки, а для проверки стабильности — сообщения о том, что всё идёт по плану. Чтобы их можно было просто разделить между собой, используют разные уровни логирования.
- Debug — когда мы пишем в лог сообщения, что стартовала какая-то функция или мы получили ответ от сервера.
- Info — информация о разовых ситуациях, например: считали базу данных при запуске, установили соединение с сервером, начали работу.
- Warning — ещё не ошибка, но происходит что-то странное: сервер не ответил, пользователь ввёл не тот пароль, вместо данных пришли нули.
- Error — ошибки в работе программы. Обычно их отлавливают с помощью исключений.
Уровней логирования может быть и больше, в зависимости от возможностей логгера. По этим уровням можно в логах отфильтровать, какой уровень мы хотим посмотреть. Чтобы записать событие в лог на каком-то уровне, например info, обычно его используют как метод при вызове логгера:
logger.info('Запустился модуль проверки лицензии, ждём ответ')
При желании можно даже вести лог каждого уровня в своём отдельном файле, но такое бывает нечасто. Проще держать всё в одном файле и фильтровать.
А можно сделать свой логгер и им пользоваться в проектах?
Можно: придумываете формат логирования, пишете под это библиотеку, используете. Правда, так почти не делают, потому что всё уже придумано до нас.
Если ваш логгер решает какую-то совсем простую задачу, то можно обойтись и console.log() или записью той же строчки в файл. А для более сложных проектов проще использовать уже готовый логгер: скорее всего, у него будет больше возможностей.
Лучше не тратить время на разработку того, что уже есть, а сосредоточиться на задачах, которые ещё никто не решил.
Что дальше
Теперь, когда мы знаем о логгерах достаточно, попробуем применить их в разных проектах — сначала на JavaScript, а потом на Python.