Уровни логирования: как правильно использовать логи

Уровни логирования: как правильно использовать логи

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 с указанием методов и классов, которые привели к возникновению ошибки.

В самом конце – время завершения инициализации приложения.


Этот лог содержит более подробную информацию, включая дату и время события с миллисекундами, уровень логирования, имя потока, класс или компонент, сообщение о событии или ошибке, стек вызова и описание исключения.


Заключение

Уровни логирования являются важным инструментом для контроля и анализа работы приложений. Правильное использование и настройка уровней логирования помогает обнаруживать и устранять ошибки, повышать производительность и надежность приложений, а также упрощает анализ и мониторинг их работы.

Обсудить статью, узнать больше можно в телеграм канале «Тестировщики нужны».

Report Page