Как просмотреть ошибку в логах с контекстом (строками до и после)?

«Как просмотреть ошибку в логах с контекстом (строками до и после)?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При анализе инцидентов в DevOps критически важно видеть не только саму ошибку, но и события, которые к ней привели. Вот основные методы работы с контекстом логов.

1. Использование grep с контекстом:

# Показать 5 строк до и после каждой ошибки
grep -B 5 -A 5 "ERROR|Exception|FAILED" /var/log/application.log

# Показать 10 строк контекста в обе стороны (эквивалент -B 10 -A 10)
grep -C 10 "panic" /var/log/system.log

# Игнорировать регистр + контекст
grep -i -C 5 "timeout" /var/log/app/*.log

2. Работа с journalctl (systemd):

# Показать логи сервиса с контекстом ошибок
journalctl -u nginx.service --since "1 hour ago" | grep -B 3 -A 3 "error"

# Интерактивный просмотр с навигацией
journalctl -u app.service -f | grep --line-buffered -B 2 -A 2 "exception"

# Сохранить контекст ошибок в файл для анализа
journalctl -u service_name --since "today" | grep -B 5 -A 5 -i "fail" > error_context.log

3. Для Docker контейнеров:

# Просмотр логов контейнера с контекстом
docker logs --tail 200 container_name 2>&1 | grep -C 10 "error"

# Просмотр логов за последний час с временными метками
docker logs --since "1h" container_name | grep -B 5 -A 5 "exception"

# Анализ логов нескольких контейнеров сервиса
docker-compose logs --tail=50 | grep -C 5 "ERROR"

4. Продвинутые методы для production:

# Использование awk для показа N строк вокруг ошибки
tail -1000 /var/log/app.log | awk '/ERROR/{for(i=NR-4;i<=NR+4;i++)if(i>0)print a[i%5]}{a[NR%5]=$0}'

# Поиск паттерна с показом временных меток ±30 секунд от ошибки
grep -B 10 -A 10 "OutOfMemory" /var/log/app.log | grep -E "^d{4}-d{2}-d{2}"

# Анализ с помощью less (интерактивный поиск с контекстом)
less +"?ERROR" -N /var/log/large.log
# В less: нажмите 'n' для следующего вхождения, 'N' для предыдущего

5. Интеграция с мониторингом:

  • В ELK Stack (Elasticsearch, Logstash, Kibana) используйте фильтры grok для выделения контекста
  • В Grafana Loki применяйте запросы с |= для фильтрации и | logfmt для структурирования
  • Prometheus Alertmanager можно настроить на включение контекстных логов в оповещения

DevOps рекомендации:

  • Всегда логируйте с временными метками в UTC
  • Добавляйте correlation IDs для трассировки запросов через микросервисы
  • Настройте автоматический сбор логов с контекстом при срабатывании алертов
  • Используйте структурированное логирование (JSON) для машинного анализа