Уровни логирования: как правильно использовать логи
t.me/qa_chilloutЧто такое логи
Логирование – это процесс записи сообщений или событий, происходящих в приложении или системе, в специальные файлы или базы данных. В логах содержатся разнообразные данные, включая сообщения об ошибках, предупреждения, информацию о выполнении определенных действий и прочее. Одним из ключевых аспектов логирования является определение уровней логирования, которые позволяют контролировать количество и детализацию записываемых сообщений. В этой статье мы рассмотрим различные уровни логирования, их назначение и как правильно использовать и настраивать их.
Виды логов
Для того, чтобы понимать на каком уровне произошла ошибка и к какому логу необходимо обратиться, существует деление на системные, логи приложения, логи сервера, логи базы данных и многие другие. Рассмотрим некоторые наиболее часто встречающиеся.
Системные логи создаются операционной системой и содержат информацию о ее работе, включая запуск и завершение процессов, ошибки файловой системы и другие события. Системные логи помогают отслеживать работу приложения на уровне операционной системы и выявлять проблемы, связанные с конфигурацией или взаимодействием с другими приложениями.
Логи приложения создаются самим приложением и содержат информацию о его работе, такую как сообщения об ошибках, предупреждения и информацию о выполненных действиях. Такие логи помогают выявлять и исправлять ошибки в приложении, а также понимать его внутреннее состояние и последовательность действий.
Логи сервера содержат информацию о запросах к серверу и о других событиях, происходящих на сервере. Серверные логи позволяют отслеживать взаимодействие приложения с сервером, выявлять проблемы с производительностью и обрабатываемостью запросов.
Логи базы данных содержат информацию о выполняемых запросах к базе данных, изменениях данных и других событиях. Такие логи помогают отслеживать выполнение запросов, выявлять проблемы с производительностью и целостностью данных.
Когда тестировщику необходимы логи
Безусловно, все зависит от цели проводимого тестирования, уровнях доступа на стендах, так как в некоторых проектах у тестировщиков нет доступа к логам даже на тестовых стендах. Однако доступ к логам необходим и вот почему:
- настроенные логи и доступ к ним для тестировщика ускорят разбор инцидентов на продакшене, так как описание проблемы часто оказывается неполным или нечетким при воспроизведении дефекта;
- во время тестирования различных интеграций на каком-либо уровне может произойти та или иная ошибка, отследить которую только в одном сервисе может быть проблематично, поэтому желательно иметь доступ к логам всех задействованных сервисов;
- при функциональном тестировании также стоит обращать внимание на логи - мы можем так найти какую-то невидимую в пользовательском кейсе ошибку или появившуюся ошибку в интеграции с каким-либо из сервисов, о котором могли не подумать при составлении чек-листа/тест-кейсов для задачи.
Уровни логирования
В большинстве систем логирования принято использовать следующие стандартные уровни логирования:
- TRACE – это самый низкий уровень детализации. Используется для записи самой подробной информации о выполнении программы, такой как значения переменных, шаги выполнения алгоритмов и т.д. Обычно не рекомендуется использовать этот уровень в production-окружении из-за большого объема записываемых данных.
- DEBUG – используется для записи отладочной информации, которая помогает выявлять и исправлять ошибки в программном коде. Этот уровень полезен во время разработки и тестирования приложения.
- INFO – используется для записи основной информации о работе программы, такой как запуск и остановка сервисов, начало и завершение задач и т.д. Этот уровень часто используется для мониторинга работы приложения в production-окружении.
- WARN – данный уровень логирования используется для записи предупреждений о потенциальных проблемах или нештатных ситуациях, которые не являются критическими, но требуют внимания. Например, некорректные данные, но приложение может продолжать работу.
- ERROR – используется для записи сообщений об ошибках, которые привели к некорректной работе приложения или серьезным проблемам. Этот уровень логирования обычно требует немедленного вмешательства.
- FATAL – пожалуй, самый высокий уровень логирования. Используется для записи критических ошибок, которые привели к неработоспособности приложения или серьезным последствиям. Этот уровень логирования может сигнализировать о необходимости перезапуска приложения или системы.
Правильное использование уровней логирования
Правильное использование уровней логирования играет важную роль в разработке, поддержке и тестировании приложений.
При выборе уровня логирования важно учитывать контекст и цели записи логов. Необходимо выбирать уровень так, чтобы он обеспечивал достаточный уровень детализации, но не перегружал лог-файлы излишней информацией. Например, в процессе разработки и тестирования может быть уместно использовать более детальный уровень логирования, в то время как в production-окружении следует использовать более осторожный подход и избегать излишней детализации.
Помимо выбора уровня логирования важно также записывать достаточную информацию о контексте события, такую как время, место, вызвавший код и т.д. Это помогает лучше понять причины возникновения проблем и упрощает их отладку и анализ.
Пример
2023-02-15 10:23:45 [INFO] GET /api/users/123456 2023-02-15 10:24:02 [ERROR] POST /api/login 2023-02-15 10:25:12 [WARN] GET /api/products?category=electronics
Разбор лога:
2023-02-15 10:23:45:
это дата и время события. В данном случае, событие произошло 15 февраля 2023 года в 10 часов 23 минуты 45 секунд.
[INFO], [ERROR], [WARN]:
это уровень логирования или тип события.
- [INFO]: информационное сообщение. В данном случае, это успешный запрос на получение данных о пользователе.
- [ERROR]: сообщение об ошибке. В данном случае, это ошибка при попытке входа пользователя.
- [WARN]: предупреждение. В данном случае, это предупреждение о получении данных о продуктах с категорией "electronics".
GET /api/users/123456, POST /api/login, GET /api/products?category=electronics: это HTTP метод и URL запроса.
GET /api/users/123456:
запрос на получение данных о пользователе с идентификатором 123456.POST /api/login:
запрос на вход пользователя.GET /api/products?category=electronics:
запрос на получение списка продуктов с категорией "electronics".
В данном примере серверный лог содержит информацию о различных HTTP запросах к серверу, включая их тип, URL, а также уровень важности события (информация, ошибка, предупреждение).
Рассмотрим еще один пример:
2023-02-15T10:23:45.123456Z [DEBUG] [Thread-1] com.example.Application: Starting application initialization process 2023-02-15T10:24:02.987654Z [ERROR] [Thread-5] com.example.Controller: Error processing request for /api/users/123456 java.lang.NullPointerException: User ID is null at com.example.Service.getUserById(Service.java:78) at com.example.Controller.getUserDetails(Controller.java:56) at com.example.Controller.handleRequest(Controller.java:32) at sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) . . . 2023-02-15T10:25:12.345678Z [INFO] [Thread-8] com.example.Application: Application initialization process completed successfully
В этом примере серверный лог содержит следующую информацию:
2023-02-15T10:23:45.123456Z:
дата и время события в формате ISO 8601 с миллисекундами и временной зоной.
[DEBUG], [ERROR], [INFO]:
уровень логирования.
[Thread-1], [Thread-5], [Thread-8]:
имя потока, в котором произошло событие.
com.example.Application, com.example.Controller, com.example.Service:
полное имя класса или компонента, который вызвал лог.
Starting application initialization process, Error processing request for /api/users/123456, Application initialization process completed successfully:
сообщение о событии или описании ошибки.
java.lang.NullPointerException: User ID is null:
стек вызова и описание исключения.
Затем, сам стек вызова Java с указанием методов и классов, которые привели к возникновению ошибки.
В самом конце – время завершения инициализации приложения.
Этот лог содержит более подробную информацию, включая дату и время события с миллисекундами, уровень логирования, имя потока, класс или компонент, сообщение о событии или ошибке, стек вызова и описание исключения.
Заключение
Уровни логирования являются важным инструментом для контроля и анализа работы приложений. Правильное использование и настройка уровней логирования помогает обнаруживать и устранять ошибки, повышать производительность и надежность приложений, а также упрощает анализ и мониторинг их работы.
Обсудить статью, узнать больше можно в телеграм канале «Тестировщики нужны».