Логи
Что такое логи?
Логи (logs) - это записи о событиях, происходящих в системе во время её работы. Для тестировщика логи являются ценным источником информации для:
- Диагностики проблем и поиска причин багов
- Понимания поведения системы в различных сценариях
- Получения технических деталей для баг-репортов
- Отслеживания производительности приложения
Типы логов
Логи браузера
Console (Консоль браузера)
- JavaScript ошибки
- Предупреждения и информационные сообщения
- Результаты выполнения скриптов
Network (Сетевые запросы)
- HTTP запросы и ответы
- Время загрузки ресурсов
- Статус-коды ответов
- Размеры передаваемых данных
Security (Безопасность)
- Ошибки HTTPS сертификатов
- Mixed content warnings
- CORS ошибки
Серверные логи
Application Logs (Логи приложения)
- Ошибки выполнения кода
- Исключения и stack traces
- Бизнес-логика приложения
Access Logs (Логи доступа)
- Запросы к серверу
- IP адреса клиентов
- User agents
- Время ответа
Error Logs (Логи ошибок)
- Критические ошибки сервера
- 500, 502, 503 ошибки
- Проблемы конфигурации
Логи базы данных
Query Logs (Логи запросов)
- Выполняемые SQL запросы
- Время выполнения запросов
- Планы выполнения
Error Logs (Логи ошибок БД)
- Ошибки подключения
- Синтаксические ошибки SQL
- Проблемы с производительностью
Как найти и открыть логи
Логи браузера (DevTools)
Chrome/Edge:
1. Нажмите F12 или Ctrl+Shift+I
2. Перейдите на вкладку "Console"
3. Настройте фильтры по уровню (Errors, Warnings, Info)
4. Для сетевых логов откройте вкладку "Network"
Firefox:
1. Нажмите F12
2. Откройте вкладку "Console"
3. Настройте категории (Errors, Warnings, Logs, Info)
4. Для сетевых запросов используйте вкладку "Network"
Сохранение логов браузера:
1. Правый клик в консоли
2. Выберите "Save as..." или "Copy"
3. Сохраните файл с расширением .log или .txt
Серверные логи
Linux сервера:
# Основные логи системы
/var/log/syslog # Общие системные события
/var/log/auth.log # События аутентификации
/var/log/nginx/ # Логи веб-сервера Nginx
/var/log/apache2/ # Логи веб-сервера Apache
# Логи приложений
/var/log/application/ # Логи вашего приложения
/opt/app/logs/ # Альтернативное расположение
Windows сервера:
C:\inetpub\logs\LogFiles\ # IIS логи
C:\Windows\System32\LogFiles\ # Системные логи
C:\ProgramData\[App]\logs\ # Логи приложений
Просмотр логов в реальном времени:
# Последние строки файла
tail -f /var/log/application.log
# Фильтрация по ключевому слову
tail -f /var/log/application.log | grep ERROR
# Просмотр последних 100 строк
tail -n 100 /var/log/application.log
Логи в Docker контейнерах
# Просмотр логов контейнера
docker logs container_name
# Следить за логами в реальном времени
docker logs -f container_name
# Показать только последние строки
docker logs --tail 50 container_name
# Логи с временными метками
docker logs -t container_name
Чтение и анализ логов
Структура лог-записи
Типичный формат записи:
[2024-01-15 14:30:25] ERROR [UserController] Authentication failed for user: john@example.com
Компоненты:
- Timestamp - время события
- Level - уровень важности (ERROR, WARN, INFO, DEBUG)
- Component - модуль или класс
- Message - описание события
Уровни логирования
ERROR (Ошибки):
- Критические проблемы
- Исключения в коде
- Сбои в работе системы
[ERROR] Failed to connect to database: Connection timeout
[ERROR] NullPointerException in PaymentService.processPayment()
WARN (Предупреждения):
- Потенциальные проблемы
- Использование deprecated функций
- Неоптимальное поведение
[WARN] API rate limit approaching for user 12345
[WARN] Using deprecated function getUserData()
INFO (Информация):
- Важные события системы
- Успешные операции
- Старт/остановка сервисов
[INFO] User successfully logged in: john@example.com
[INFO] Payment processed successfully: order #12345
DEBUG (Отладка):
- Детальная информация для разработчиков
- Значения переменных
- Трассировка выполнения
[DEBUG] Entering method calculateTotalPrice()
[DEBUG] Variable totalAmount = 150.75
Поиск проблем в логах
Grep команды для поиска
# Поиск ошибок
grep -i "error" application.log
# Поиск по конкретному пользователю
grep "user@example.com" application.log
# Поиск за определенное время
grep "2024-01-15 14:" application.log
# Поиск с контекстом (5 строк до и после)
grep -C 5 "database connection" application.log
# Поиск нескольких файлов
grep -r "OutOfMemoryError" /var/log/
# Подсчет количества ошибок
grep -c "ERROR" application.log
Анализ производительности
Медленные запросы:
# Поиск запросов дольше 1 секунды
grep "duration.*[1-9][0-9][0-9][0-9]ms" application.log
# Поиск таймаутов
grep -i "timeout" application.log
Нагрузка на систему:
# Количество запросов в минуту
grep "$(date '+%Y-%m-%d %H:%M')" access.log | wc -l
# Самые частые endpoints
grep "GET\|POST" access.log | awk '{print $7}' | sort | uniq -c | sort -nr
Практические сценарии для тестировщика
1. Исследование бага авторизации
Шаги:
- Воспроизведите баг с конкретными данными
- Найдите логи по времени и пользователю:
grep "2024-01-15 14:3" auth.log | grep "john@example.com"
- Ищите ERROR или WARN записи
- Анализируйте stack trace для понимания причины
Пример лог-записи:
[2024-01-15 14:35:42] ERROR [AuthService] Invalid password for user: john@example.com
[2024-01-15 14:35:42] DEBUG [AuthService] Attempted password hash: a1b2c3...
[2024-01-15 14:35:42] DEBUG [AuthService] Expected password hash: x1y2z3...
2. Анализ проблем с API
Поиск в Network вкладке DevTools:
- Откройте Network tab перед выполнением запроса
- Выполните действие, вызывающее API запрос
- Найдите запрос со статусом 4xx или 5xx
- Посмотрите Response для деталей ошибки
Серверные логи для API:
# Поиск ошибок API
grep "api/v1" application.log | grep ERROR
# Поиск медленных API запросов
grep "api/v1.*duration.*[5-9][0-9][0-9]ms" application.log
3. Отладка проблем с базой данных
Типичные ошибки в логах:
[ERROR] Connection pool exhausted
[ERROR] Deadlock found when trying to get lock
[ERROR] Table 'users' doesn't exist
[ERROR] Duplicate entry '123' for key 'PRIMARY'
Поиск проблем:
# Проблемы с подключением к БД
grep -i "connection" application.log | grep -i "error\|fail"
# Медленные запросы
grep "Query.*duration.*[1-9][0-9][0-9][0-9]ms" mysql.log
# Дедлоки
grep -i "deadlock" mysql.log
Инструменты для работы с логами
Локальные инструменты
LogExpert (Windows):
- Цветовая подсветка
- Фильтрация и поиск
- Мониторинг файлов в реальном времени
Tail (Linux/Mac):
# Базовое использование
tail -f application.log
# С цветовой подсветкой
tail -f application.log | grep --color=always -E 'ERROR|WARN|$'
Less (просмотр больших файлов):
# Открыть файл для просмотра
less application.log
# Поиск внутри файла
/search_term
# Переход к концу файла
G
Веб-инструменты
Kibana (с Elasticsearch):
- Мощные возможности поиска
- Визуализация данных
- Дашборды и алерты
Grafana (с Loki):
- Интеграция с метриками
- Создание дашбордов
- Алертинг по логам
Papertrail:
- Облачное хранение логов
- Поиск в реальном времени
- Интеграция с различными сервисами
Настройка алертов
Простой скрипт мониторинга:
#!/bin/bash
# Проверка критических ошибок
ERROR_COUNT=$(grep "CRITICAL" /var/log/app.log | wc -l)
if [ $ERROR_COUNT -gt 10 ]; then
echo "Критических ошибок: $ERROR_COUNT" | mail -s "Alert!" admin@company.com
fi
Создание полезных логов для тестирования
Что логировать в приложении
Обязательно:
- Все ошибки с stack trace
- Важные бизнес-события
- Аутентификацию и авторизацию
- Внешние API вызовы
Полезно:
- Входящие параметры функций
- Время выполнения операций
- Изменения состояния объектов
- Решения бизнес-логики
Пример хорошего логирования
@Service
public class PaymentService {
private static final Logger logger = LoggerFactory.getLogger(PaymentService.class);
public PaymentResult processPayment(PaymentRequest request) {
logger.info("Processing payment for order: {}, amount: {}",
request.getOrderId(), request.getAmount());
try {
// Логирование важных шагов
logger.debug("Validating payment data for order: {}", request.getOrderId());
validatePaymentData(request);
logger.debug("Calling external payment service for order: {}", request.getOrderId());
ExternalResponse response = paymentGateway.charge(request);
if (response.isSuccess()) {
logger.info("Payment successful for order: {}, transaction: {}",
request.getOrderId(), response.getTransactionId());
return PaymentResult.success(response.getTransactionId());
} else {
logger.warn("Payment failed for order: {}, reason: {}",
request.getOrderId(), response.getErrorMessage());
return PaymentResult.failure(response.getErrorMessage());
}
} catch (Exception e) {
logger.error("Payment processing error for order: {}", request.getOrderId(), e);
return PaymentResult.failure("Internal error");
}
}
}
Использование логов в баг-репортах
Включение логов в баг-репорт
Структура:
**Логи ошибок:**
Browser Console:
[Error] TypeError: Cannot read property 'length' of undefined at validateForm (main.js:157) at HTMLFormElement.onSubmit (main.js:201)
Server Logs:
[2024-01-15 14:35:42] ERROR [ValidationService] Form validation failed: field 'email' is required but was null [2024-01-15 14:35:42] DEBUG [ValidationService] Request data: {"name":"John","email":null,"phone":"123456"}
Фильтрация чувствительных данных
Что НЕ включать в баг-репорты:
- Пароли и токены доступа
- Персональные данные пользователей
- Коммерческую информацию
- Внутренние IP адреса и пути
Как безопасно делиться логами:
# Удаление чувствительных данных
sed 's/password=[^&]*/password=****/g' application.log > safe_log.txt
sed 's/token=[^&]*/token=****/g' safe_log.txt > final_log.txt
Заключение
Логи - это "черный ящик" вашего приложения. Умение читать и анализировать логи:
- Ускоряет диагностику проблем
- Помогает понять root cause багов
- Улучшает качество баг-репортов
- Позволяет находить скрытые проблемы
- Помогает в оптимизации производительности
Всегда включайте релевантные логи в ваши баг-репорты - это значительно ускорит процесс исправления проблем.