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

Ответ

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

Базовый пример для системных логов:

grep -i "error|fail|critical|exception" /var/log/syslog
  • -i — игнорирует регистр (Error, ERROR).
  • | в паттерне — логическое ИЛИ.

Для структурированных логов (JSON):

grep '"level":"error"' /var/log/app.log | jq .  # jq для красивого вывода

Практические примеры из моей работы:

  1. Nginx/Apache: Ищу HTTP-коды состояния 5xx и 4xx.
    grep -E " 5[0-9]{2} | 4[0-9]{2} " /var/log/nginx/access.log
  2. Docker контейнеры: Просмотр логов конкретного контейнера с фильтром.
    docker logs my-app-container 2>&1 | grep -A 2 -B 2 "ERROR"

    Флаг -A 2 -B 2 показывает 2 строки до и после совпадения для контекста.

  3. Журнал systemd (journalctl): Более мощный и структурированный способ.
    journalctl -u my-service.service --since "1 hour ago" -p err

    Параметр -p задает приоритет (emerg, alert, crit, err).

Важно: Для постоянного мониторинга настройте сбор логов в централизованную систему (ELK Stack, Loki, Datadog), где фильтрация и алертинг на ошибки настраиваются через UI или конфигурационные файлы.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Ты про фильтрацию логов спрашиваешь? Да это ж святое дело, я этим каждый день занимаюсь, ебать мои старые костыли.

Смотри, чувак, основа основ — это grep. Без него нихуя не сделаешь. Главное — понять, как у тебя эти ошибки в логах выглядят. Иногда они такие замаскированные, что их только с лупой найдёшь, а иногда — прям кричат на всю строку "ERROR", тут уж волнение ебать не нужно.

Вот самый простой пример, с которого все начинают:

grep -i "error|fail|critical|exception" /var/log/syslog

Видишь этот |? Это типа "или". То есть ищет или error, или fail, или critical. А -i — это чтобы ему было похуй на регистр, найдет и ERROR, и Error, и eRrOr. Удобная штука.

А вот если у тебя логи в JSON пишутся — это уже цивилизация, можно красиво:

grep '"level":"error"' /var/log/app.log | jq .  # jq для красивого вывода

Тут jq — это вообще магия, он тебе этот JSON развернёт как надо, а не сплошной стеной текста.

Из моего личного опыта, вот что часто выручает:

  1. Для веб-серверов (Nginx/Apache): Там всё по кодам статуса. Пятисотые (5xx) — это серверные косяки, четырёхсотые (4xx) — клиентские. Ищешь так:

    grep -E " 5[0-9]{2} | 4[0-9]{2} " /var/log/nginx/access.log

    Регулярка [0-9]{2} — это чтобы две цифры подряд поймать. Без неё можно и мимо промахнуться.

  2. Docker контейнеры: Тут бывает такое, что контейнер накрылся медным тазом, а ты сидишь и думаешь — какого хуя? Смотри:

    docker logs my-app-container 2>&1 | grep -A 2 -B 2 "ERROR"

    Флаги -A 2 -B 2 — золотые. Они покажут тебе 2 строки ДО ошибки и 2 строки ПОСЛЕ. Контекст, блядь! А то найдёшь одну строчку с "ERROR", а что вокруг было — хуй знает. Без контекста иногда нихуя не понятно.

  3. Systemd (через journalctl): Это уже овердохуища мощный инструмент, если ты на системе с systemd.

    journalctl -u my-service.service --since "1 hour ago" -p err

    Тут -p err — это фильтр по приоритету. Можно и crit, и alert указать. А --since "1 hour ago" — чтобы не вываливать тебе лог за всю жизнь, а только за последний час. Умно, да?

Но слушай, самый главный совет. Если ты это делаешь руками каждый день — ты, прости, ебанько. Надо настраивать централизованный сбор логов. ELK Stack, Loki, Grafana — да что угодно. Там ты в веб-морде настраиваешь фильтры, дашборды, алерты. И когда что-то сломается, система сама тебе в телегу или слак напишет: "Чувак, там у тебя сервис payment-gateway хуй в пальто выдал, иди смотри". Вот это — правильный путь. А ковыряться в grep по 10 файлам одновременно — это как будто на дворе 2002-й год.