← Назад к вопросам

Как из файла логов вывести только ошибки

1.2 Junior🔥 202 комментариев
#Linux и администрирование#Скриптинг и программирование

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Фильтрация логов: извлечение ошибок

Фильтрация записей об ошибках из логов — одна из базовых, но критически важных задач для DevOps-инженера. От эффективности этого процесса зависит скорость обнаружения инцидентов и отладки. Методы зависят от формата логов, их объема и доступных инструментов.

Базовые методы в командной строке (Linux/Unix)

Для работы с простыми текстовыми логами чаще всего используются цепочки утилит grep, awk и sed.

1. Использование grep для поиска по ключевым словам Это самый распространенный и быстрый способ. Ищем строки, содержащие слова error, failed, exception (в зависимости от приложения).

# Простой поиск слова error (регистрозависимый)
grep 'error' /var/log/app.log

# Регистронезависимый поиск
grep -i 'error' /var/log/app.log

# Поиск нескольких паттернов
grep -E 'error|failed|critical' /var/log/app.log

# Вывод контекста: N строк до и после найденной ошибки
grep -B 2 -A 5 'error' /var/log/app.log

# Рекурсивный поиск по всем логам в директории
grep -r 'error' /var/log/myapp/

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

# Вывести строки, где в 4-м столбце (уровень логирования) стоит "ERROR"
awk '$4 == "ERROR"' /var/log/app.log

# Вывести строки, содержащие "error", и выделить только время и сообщение
awk '/error/ {print $1, $2, $NF}' /var/log/app.log

3. Комбинации с tail и journalctl для мониторинга в реальном времени

# Следить (follow) за логом и фильтровать ошибки на лету
tail -f /var/log/app.log | grep --line-buffered 'error'

# Для systemd-сервисов используем journalctl
journalctl -u nginx.service -f --grep="error"
journalctl -u myapp --since "1 hour ago" -p err

Работа со структурированными логами (JSON)

Современные приложения часто пишут логи в JSON-формате, что позволяет фильтровать по структурированным полям.

1. Использование jq — мощного процессора JSON

# Предположим, каждая строка лога — отдельный JSON-объект
# Выбрать объекты, где поле 'level' имеет значение 'ERROR'
cat /var/log/app.json.log | jq 'select(.level == "ERROR")'

# Вывести только сообщения об ошибках
cat /var/log/app.json.log | jq 'select(.level == "ERROR") | .message'

# Фильтрация по наличию поля 'error'
cat /var/log/app.json.log | jq 'select(has("error_code"))'

2. Комбинация grep и jq для производительности Если файл очень большой, иногда быстрее предварительно отфильтровать строки, содержащие "ERROR", а затем разобрать их через jq.

grep '"level":"ERROR"' /var/log/app.json.log | jq .

Продвинутые подходы для промышленного использования

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

  • Сбор и агрегация логов: Fluentd, Logstash, Vector. Они могут применять фильтры на этапе сбора.
    # Пример фильтра Fluentd для отбора ошибок
    <filter app.log>
      @type grep
      <regexp>
        key level
        pattern /ERROR|CRITICAL/
      </regexp>
    </filter>
    
  • Сторожевые системы (Monitoring): Prometheus + Alertmanager на основе метрик, извлеченных из логов (через Grafana Loki или экспортеры).
  • Специализированные log-менеджеры: Grafana Loki, Elastic Stack. Позволяют использовать мощные языки запросов (LogQL, KQL).
    # Пример запроса в Grafana Loki
    {app="myapp"} |= "error" | logfmt | level="error"
    

Ключевые рекомендации

  • Определите четкие паттерны ошибок: Договоритесь с разработчиками о едином формате логирования (например, всегда добавлять поле level).
  • Используйте ротацию логов: logrotate предотвратит заполнение диска.
  • Не пренебрегайте контекстом: Выводя ошибку, обязательно сохраняйте или выводите несколько строк контекста (grep -A -B), чтобы понять предшествующие события.
  • Автоматизируйте реакцию: Настройте алертинг в Prometheus Alertmanager, Datadog или PagerDuty при появлении критических ошибок в логах.

Выбор метода зависит от контекста: для быстрой отладки на сервере хватит grep, для анализа трендов нужен ELK Stack, а для оперативного реагирования — интеграция логов в систему мониторинга и алертинга.