Логи

Что такое логи?

Логи (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. Исследование бага авторизации

Шаги:

  1. Воспроизведите баг с конкретными данными
  2. Найдите логи по времени и пользователю:
grep "2024-01-15 14:3" auth.log | grep "john@example.com"
  1. Ищите ERROR или WARN записи
  2. Анализируйте 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:

  1. Откройте Network tab перед выполнением запроса
  2. Выполните действие, вызывающее API запрос
  3. Найдите запрос со статусом 4xx или 5xx
  4. Посмотрите 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 багов
  • Улучшает качество баг-репортов
  • Позволяет находить скрытые проблемы
  • Помогает в оптимизации производительности

Всегда включайте релевантные логи в ваши баг-репорты - это значительно ускорит процесс исправления проблем.